我如何根据应用程序主题更改 icon.png (day/night) android kotlin

How can i change icon.png depending on app theme (day/night) android kotlin

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

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

因为你使用的是png格式。您可以在上下文对象上调用 .getTheme() 来获取当前主题,进行 if 语句来决定显示哪个 png。

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

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

通常的方法是使用 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 条件的资源文件夹中获得一个版本,这样它才能为暗模式提供替代资源。这取决于您要制作夜间版本的层次结构中的哪个资源(或者如果需要,您可以为所有资源制作夜间版本)。

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