【问题标题】:ContextCompat.getColor method ignores Night ModeContextCompat.getColor 方法忽略夜间模式
【发布时间】:2019-09-03 23:09:55
【问题描述】:

我正在为我的 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有关

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

【问题讨论】:

  • 你试过用getContext代替getActivity吗?只是在黑暗中拍摄,但也许有一些上下文主题包装器参与其中的案例活动!=上下文。
  • 已经试过了,还是不行:结果一样
  • thisgetActivity(),假设 Fragment 在该活动中,实际上是完全相同的对象。由于ContextCompat 是一个静态方法,因此在相同的输入和相同的时间点下,它们绝对会做同样的事情。

标签: java android xml android-night-mode


【解决方案1】:

解决了问题,但我在这里帮助其他人解决同样的问题。

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

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

TL;DR

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

  • 检查是否仍有问题

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多