java - ContextCompat.getColor 方法忽略夜间模式

标签 java android xml android-night-mode

我正在为我的 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”库

不知道是不是和this bug有关

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

最佳答案

解决了问题,但我来这里是为了帮助其他有同样问题的人。

奇怪的行为是由 Webview 引起的。如 this link 所述,当你第一次打开一个 Webview 然后交换一个 fragment 或向 UI 添加新 View 时,它们会使用错误的颜色,而不尊重夜间主题。 如果您以编程方式获取颜色,也会出现同样的问题。 我尝试了一些解决方法,例如重新创建 Activity 或使资源缓存无效,它们实际上解决了问题,但它们在性能方面确实很糟糕。

升级到 androidx.appcompat:appcompat:1.1.0-rc01 至少部分解决了这个问题。 如果您有一些未定义颜色的 View ,无论是在应用程序的主题中还是在布局 xml 中,那么在第一次启动 web View 然后更改 fragment 时,它们仍然会出现故障并使用错误的颜色。 因此,您应该使用夜间颜色的资源变体 (-night) 来定义应用程序主题中 View 的每种颜色。 如果您这样做, View 将遵循您的主题并使用正确的颜色

长话短说

  • 升级到androidx.appcompat:appcompat 1.1.0-rc01或最新

  • 检查是否还有问题

  • 如果是,则为您尚未在主题或 xml 中定义颜色的每个 View 设置颜色,对深色主题使用 -night 变体

关于java - ContextCompat.getColor 方法忽略夜间模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57779661/

相关文章:

java - OkHttp 每个请求超时设置?

安卓 Debug模式 :Is it possible to view raw query or in-built query build by queryBuilder for countOf?

PHP addChild 到列表顶部?

xml - 创建一个可以导入到 EXCEL 的 XSD,具有基于元素值的限制

php - ajax请求后获取json中的值

java - 正则表达式:必须以 'id-' 开头但不能等于但可以以 'id-bitcoin' 开头

java - 在方法中返回 List<?> 有什么用?

android - 应用程序标题下有关某些 Activity 的文字

android - 布局和应用程序标题之间的填充不同

java - 如何在集群上使用 JVM 程序? (比如停产的 cJVM/JavaSplit)