3
1

Android WebViewのダークモード

Last updated at Posted at 2023-08-27

はじめに

AndroidはChromeで強制ダークモードが使えるため、
WebViewも可能だろうと思い調べてみたところ、
設定が思いのほか複雑だったので、まとめてみました

設定方法

SDK Versionとダークモードの適用方法(ダークモード対応サイトのみ、強制ダークモード)によって、設定を分類しています

SDK Version 33

ダークモード対応サイトのみダークモードにする

WebViewもしくは、より上位のViewにTheme_isLightThemeが定義されたThemeを設定する

<WebView
    android:id="@+id/web_view"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:theme="@style/Theme.MaterialComponents.DayNight"/>

全てのサイトをダークモードにする

Theme_isLightThemesetAlgorithmicDarkeningAllowed()trueに設定する
trueに設定しても、ダークモード対応サイトはそのサイトで定義されたカラーで表示される

if(WebViewFeature.isFeatureSupported(WebViewFeature.ALGORITHMIC_DARKENING)) {
    WebSettingsCompat.setAlgorithmicDarkeningAllowed(binding.webView.settings, true)
}

SDK Version 29〜32

ダークモード対応サイトのみダークモードにする

ダークON/OFF設定とsetForceDark()の値を同期させて、setForceDarkStrategy()DARK_STRATEGY_WEB_THEME_DARKENING_ONLYに設定する

if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK) && WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK_STRATEGY)) {
    when (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) {
        Configuration.UI_MODE_NIGHT_YES -> {
            WebSettingsCompat.setForceDark(binding.webView.settings, WebSettingsCompat.FORCE_DARK_ON)
        }

        Configuration.UI_MODE_NIGHT_NO, Configuration.UI_MODE_NIGHT_UNDEFINED -> {
            WebSettingsCompat.setForceDark(binding.webView.settings, WebSettingsCompat.FORCE_DARK_OFF)
        }
    }
    WebSettingsCompat.setForceDarkStrategy(binding.webView.settings, WebSettingsCompat.DARK_STRATEGY_WEB_THEME_DARKENING_ONLY)
}

全てのサイトをダークモードにする

ほぼ同じで、違いはsetForceDarkStrategy()の設定値をDARK_STRATEGY_PREFER_WEB_THEME_OVER_USER_AGENT_DARKENINGにする

if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK) && WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK_STRATEGY)) {
    when (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) {
        Configuration.UI_MODE_NIGHT_YES -> {
            WebSettingsCompat.setForceDark(binding.webView.settings, WebSettingsCompat.FORCE_DARK_ON)
        }

        Configuration.UI_MODE_NIGHT_NO, Configuration.UI_MODE_NIGHT_UNDEFINED -> {
            WebSettingsCompat.setForceDark(binding.webView.settings, WebSettingsCompat.FORCE_DARK_OFF)
        }
    }
    WebSettingsCompat.setForceDarkStrategy(binding.webView.settings, WebSettingsCompat.DARK_STRATEGY_PREFER_WEB_THEME_OVER_USER_AGENT_DARKENING)
}

SDK Version 〜28

ダークモードに対応していないため、ライトテーマでの表示となる

おまけ : Chromeの強制ダークモード設定方法

chrome://flags
-> Auto Dark Mode for Web Contents : Enabled

参考にさせていただいたリンク

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1