安卓漏洞:夜间模式下加载错误的颜色

7

免责声明:我已经找到了解决这个问题的方法,但是由于花费了很长时间才弄清楚为什么会出现这种情况,因此我想发帖提供答案给其他人参考。

我遇到了一个奇怪的问题,就是当在夜间模式下打开我的应用程序时,有些UI以正确的夜间模式颜色加载,而有些UI则以正常颜色加载。

1个回答

12
发现有一个奇怪的错误,只有 第一次 创建 WebView 时,才会重置 UI 模式。所以对我来说,发生的情况是:
- 应用程序初始化并设置为夜间模式。 - 在初始活动中加载部分 UI 并使用适当的颜色。 - 异步调用以获取内容。 - 在辅助片段中创建 WebView,重置 UI 模式。 - 异步调用返回,并在正常模式下加载 UI 元素。
解决方案(我在这里找到),是在应用程序启动时初始化一个未被使用过的虚拟 WebView 来启用夜间模式之前,这样下一次使用 WebView 时它就不会重置 UI 模式。因此,像这样:

class MyApplication : Application() {
  
  override fun onCreate() {
        super.onCreate()
        val nightModeEnabled = //get value from shared prefs or wherever you are storing this flag
        if (nightModeEnabled) {
            Timber.d("Manually instantiating WebView to avoid night mode issue.");
            try {
                WebView(applicationContext)
            } catch (e: Exception) {
                Timber.e("Got exception while trying to instantiate WebView to avoid night mode issue. Ignoring problem.", e)
            }
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
        }
  }
}

编辑 看起来他们可能已经在Appcompat Version 1.1.0-alpha03中修复了这个问题(尽管我并没有实际尝试过) “Fixed WebView resets DayNight Resources (b/37124582)”


1
这个修复方案解决了问题,但最近我们注意到它在搭载Android P的三星设备上导致了崩溃。你可以在这里看到崩溃报告:https://dev59.com/2lcP5IYBdhLWcg3wqLvA 你是否遇到了类似的崩溃? - display name
我正在使用Appcompat 1.1.0,问题仍然存在。也许他们在发布的版本中撤消了修复? - chrisbtoo
大家好,来自2021年的问候:即使使用AppCompat 1.3.0版本,这一点仍然是必需的。 - SebastianBrandt
在应用程序类中初始化WebView会影响应用程序的初始化性能,它将需要大约200毫秒。 - changhao cui
@SebastianBrandt你好,来自2023年的问候: AppCompat 1.6.1 - 问题仍然存在。 - Ololoking
@SebastianBrandt你好,来自2023年的问候: AppCompat 1.6.1 - 问题仍然存在。 - undefined

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