当前位置: 首页 > 知识库问答 >
问题:

WebView重置UiMode和打破黑暗主题

查淮晨
2023-03-14

我们的应用程序依赖于AppCompatDelegate.setDefaultNightMode(AppCompatServer.MODE_NIGHT_YES)让我们从值/颜色值-夜/颜色中拾取明暗主题颜色

但是每次我们尝试使用WebView时,它都会从重置UiMode开始,我们的应用程序会混淆为我们的主题选择哪些颜色值

有些人在这里和这里详细讨论了这个问题

有人遇到类似的问题吗?

共有3个答案

陈野
2023-03-14

首先,你需要添加Android。项目中的webkit依赖项

dependencies {
   implementation "androidx.webkit:webkit:1.3.0"
}

在撰写这篇文章时,webkit的最新稳定版本是1.3.0。值得注意的是,1.2.0版添加了黑暗主题支持,在此版本之前,无法将黑暗主题支持添加到Webview。

下一步是检查用户设备上的Webview和Android框架是否支持主题化:

if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
   ...
}

请注意,WebViewFeature。仅从Webview版本76开始支持FORCE_DARK。不幸的是,在此版本之前,没有直接的方法来支持黑暗主题。如果您拥有Webview中显示的内容,您可能希望实现自定义CSS主题,并在应用程序中使用@JavascriptInterface切换它们。

如果支持WebViewFeature.FORCE_DARK,我们可以从三个可用选项中进行选择:

FORCE_DARK_OFF-禁用深色主题,内容将在默认的浅色主题中呈现FORCE_DARK_ON-启用深色主题,内容将在深色主题中呈现FORCE_DARK_AUTO-根据父视图的状态启用深色主题然后我们需要使用WebSettinsCompat应用设置

WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_ON)

你可以在下面的博客中阅读更多详细信息

https://androidexplained.github.io/ui/android/material-design/2020/09/24/dark-mode-webview.html

佘单鹗
2023-03-14

由于上一期已经结束,我打开了新的一期:https://issuetracker.google.com/issues/170328697

我试图用这种方式解决它:

class UiModeCareWebView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : WebView(context, attrs, defStyleAttr) {

    init {
        fixUiModeIfNeeded()
    }

    private fun fixUiModeIfNeeded() {
        val configuration = context.resources.configuration
        val configurationNighMode = configuration.uiMode and UI_MODE_NIGHT_MASK
        val appCompatNightMode = getDefaultNightMode()

        val newUiModeConfiguration = when {
            configurationNighMode == UI_MODE_NIGHT_NO && appCompatNightMode == MODE_NIGHT_YES -> {
                UI_MODE_NIGHT_YES or (configuration.uiMode and UI_MODE_NIGHT_MASK.inv())
            }
            configurationNighMode == UI_MODE_NIGHT_YES && appCompatNightMode == MODE_NIGHT_NO -> {
                UI_MODE_NIGHT_NO or (configuration.uiMode and UI_MODE_NIGHT_MASK.inv())
            }
            else -> null
        }

        if (newUiModeConfiguration != null) {
            val fixedConfiguration = Configuration().apply {
                uiMode = newUiModeConfiguration
            }
            @Suppress("DEPRECATION")
            context.resources.updateConfiguration(
                fixedConfiguration,
                context.resources.displayMetrics
            )
        }
    }
}
华章横
2023-03-14

回答我自己的问题,看起来谷歌解决了这个问题https://issuetracker.google.com/issues/37124582

具有https://developer.android.com/jetpack/androidx/releases/appcompat#1.1.0-alpha03固定网络视图重置昼夜资源

 类似资料:
  • 我从eclipse.org下载了。并且我更改了上的主题。但这不是我想要的。 我如何做完全黑暗?

  • 如何更改MySQL Workbench设置,使其使用深色主题?

  • 我会尽量详细解释“请帮忙。我打开了一个新项目。在新项目中,“主题”部分打开了两次“一亮一暗”。我在应用程序中添加了黑色文字。文字看起来是白色的,因为我的手机是黑色主题。这很好,但令人费解。我只有一种颜色。xml文件(不适用于夜间版本)文本是如何变为白色的?这很好,但我添加的图标(矢量“xml”)并将其设置为灰色,但现在它无法理解。图标的颜色在黑暗中从灰色变为黑色。我想让他换成白人。我还打开了颜色。

  • eclipse for windows是否有一个暗色主题,它将滚动条和菜单栏的颜色也改为暗色? 在这篇文章中,我们可以看到漂亮的主题,但这些都是针对Mac OS的。对于Windows来说,黑色的主题看起来很难看,因为那些白色的滚动条和标题栏等等。真的!

  • 我在Windows8.1上为C/C++开发人员提供了Eclipse IDE。我从市场上安装了Darkest Dark主题,但它不起作用。在重新启动时,Eclipse以我以前的主题开始,而Darkest Dark甚至不会出现在Preferences窗口中。然而,当我再次打开Marketplace并搜索它时,它显示为已安装。我找了找,但没有找到这个确切问题的答案。有人帮忙吗?