ContextCompat.getColor 方法忽略夜间模式。

4
我正在为我的Android应用开发夜间模式。 我使用ContextCompat.getColor动态获取一些UI元素的颜色,但是这种方法没有获取正确的颜色。 当应用处于夜间模式时,也就是按照夜间资源限定符,在ContextCompat中获取的颜色来自values/colors.xml而不是values-night/colors.xml。
奇怪的是,如果我在Activity中调用ContextCompat.getColor,则它会返回正确的颜色。
//get Actual Theme Colors
String bgColor = String.format("#%06X", (0xFFFFFF & ContextCompat.getColor(this, R.color.dialogBackground)));
String txtColor = String.format("#%06X", (0xFFFFFF & ContextCompat.getColor(this, R.color.dialogText)));

相反,如果我从Activity中的Fragment调用ContextCompat.getColor,则会返回错误的颜色。

//get Actual Theme Colors
bgColor = String.format("#%06X", (0xFFFFFF & ContextCompat.getColor(getActivity(),R.color.dialogBackground)));
txtColor = String.format("#%06X", (0xFFFFFF & ContextCompat.getColor(getActivity(),R.color.dialogText)));

我正在使用'androidx.appcompat:appcompat:1.0.2'库。

我不知道它是否与这个bug有关。

希望您能找到解决方案或至少提供一些解决方法,例如从资源中获取特定配置的颜色(如果可能)。


1
你尝试过使用getContext而不是getActivity吗?这只是一个猜测,但也许涉及到一些上下文主题包装器,此时activity!= context。 - Pawel
已经尝试过了,但是它不起作用:结果相同。 - Marco Fantauzzo
1
假设Fragment在该Activity中,thisgetActivity()是完全相同的对象。由于ContextCompat是一个静态方法,因此在给定相同的输入和相同的时间情况下,它们绝对会执行相同的操作。 - ianhanniballake
这也可能发生(不是在您的情况下),当您传递一个“应用程序上下文”而不是“活动上下文”。这是因为“应用程序上下文”与主题没有关联。 - lionscribe
1个回答

3
解决了问题,但我在这里帮助其他遇到同样问题的人。
奇怪的行为是由Webview引起的。正如这个链接所述,当您第一次打开Webview,然后切换片段或向UI添加新视图时,它们将使用错误的颜色,而不尊重夜间主题。如果以编程方式获取颜色,则会出现相同的问题。 我尝试了一些解决方法,例如重新创建Activity或使资源缓存无效,它们确实解决了问题,但从性能方面来看很差。
升级到androidx.appcompat:appcompat:1.1.0-rc01可以部分地修复此问题。 如果您的某些视图中没有定义颜色,无论是在应用程序的主题还是在布局xml中,当首次启动Webview然后更改片段时,它们仍会出现故障并使用错误的颜色。 因此,您应该在应用程序的主题中使用资源变量(-night)为夜间颜色定义每个视图的颜色。 如果这样做,视图将遵循您的主题并使用正确的颜色。 TL;DR
  • 升级到androidx.appcompat:appcompat 1.1.0-rc01或更高版本
  • 检查是否仍有问题
  • 如果是,则在主题或xml中为您尚未定义颜色的每个视图设置颜色,使用夜间变量作为深色主题

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接