【问题标题】:How can i change icon.png depending on app theme (day/night) android kotlin我如何根据应用程序主题(白天/夜晚)更改 icon.png android kotlin
【发布时间】:2021-08-11 18:49:08
【问题描述】:

我的初始屏幕上有一个徽标和两个文件: logo_night.pnglogo_day.png

如何使用这两个文件更改此徽标,该徽标将根据应用程序的主题而变化?

【问题讨论】:

    标签: android kotlin android-drawable


    【解决方案1】:

    通常的方法是使用night 资源限定符,因此如果您使用深色主题,它会从等效的night 文件夹中提取指定资源(如果该文件夹存在)。

    我认为你有三个基本选择:

    • 只需将它们都称为logo.png,但将一个版本放在drawable 中,另一个放在drawable-night 中。这样,每当您引用 @drawable/logo 时,它都会根据主题提取正确的版本。如果您有多个密度版本,在drawable-hdpi 等中,您将在drawable-night-hdpi 等中需要它们(限定符顺序很重要)

    • 如果你以通常的方式制作你的启动画面,你创建一个带有背景层的启动画面,而你的徽标可在另一层上绘制,你可以只制作一个 night 的变体(在 drawable-night )。每个版本都可以明确引用logo_daylogo_night,您可以将这些PNG 保存在普通的drawable 文件夹中

    • 或者您可以制作一个night 版本的初始主题,并将背景显式设置为您的初始可绘制对象的深色版本。您的两个启动画面都可以保留在普通的drawable 文件夹中

    所以基本上,必须在night-qualified 资源文件夹中获得一个版本,这样它就可以为暗模式提供替代资源。由您决定要制作该层次结构中的哪个资源的夜间版本(或者您可以根据需要为所有资源制作)。

    另外请记住,您的启动主题(如果您这样做的话)遵循系统的暗模式设置。如果您在应用程序中实现切换,并将其设置为暗模式,则如果设备设置为这种模式,则启动画面仍将显示为亮变体。该主题是在您的应用启动之前设置的,并且可以确定它应该处于深色模式还是浅色模式

    【讨论】:

    • 是的,当我创建 drawable-night 时,它真的非常适合我,谢谢!
    【解决方案2】:

    由于您使用的是 png 格式。您可以在 context 对象上调用 .getTheme() 来获取当前主题,并使用 if 语句来决定显示哪个 png。

    例如在活动中,您可以通过调用getTheme() 来获取主题,因为 this.getTheme() 是隐含的。

    另一种可能性是切换到矢量,您可以在其中为不同的主题定义不同的颜色,当用户更改主题时,它们会自动更改。这可能是更好且更具可扩展性的解决方案。您可以找到更多详细信息here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      • 2021-02-15
      • 2021-12-27
      • 1970-01-01
      相关资源
      最近更新 更多