Skip to main content

Dark Theme (Dark Mode) in Android WebViews, WKWebViews and CSS



So your apps just implemented a shiny new dark theme and it’s looking ๐Ÿ‘Œ

There are lots of benefits to having a dark theme in your application, and having it consistent throughout your application allows for a great user experience. But what happens when the the user runs into a WebView in your app?

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

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

Current setting:
val forceDarkMode = WebSettingsCompat.getForceDark(webView.settings)

Joe Birch

Assuming your question is asking how to change the colors of the HTML content you are displaying in a WKWebView based on whether light or dark mode is in effect, there is nothing you do in your app's code. All changes need to be in the CSS being used by your HTML content.

CSS dark mode via :root variables, explicit colors and @media query:
:root {
    color-scheme: light dark;
        --h1-color: #333;
        --header-bg-clr: #FFF1FF;
        --header-txt-clr: white;
    }
    @media (prefers-color-scheme: dark) {
    :root {
        color-scheme: light dark;
        --h1-color: #333;
        --header-bg-clr: #FFF1FF;
        --header-txt-clr: white;
        }
    }

body { }
h1 { color: var(--h1-color); }
.header {
    background-color: var (--header-bg-clr);
    color: var(--header-txt-clr);
}

Automatic dark mode by inverting colors:
@media (prefers-color-scheme: dark) {
     /* root tag inverting all the components color except the table.*/
     : root {
            color-scheme: light dark;
        filter: invert(100%);
       -webkit-filter: invert(100%)
     }
    /*table tag needed for inverting table content.*/
    table {
            filter: invert(100%);
     }
    /* If We do color invert in : root , images will be color inverted and it will be in negative. If we invert again these negative images, it will be positive.*/
     img {
         filter: invert(100%);
     }

    }

StackOverflow

Comments

Most Favorite Posts

How to link to TestFlight App in iOS

There are two things you need to do. First, check to see if TestFlight is installed. Then create a new link to your app. NSURL *customAppURL = [NSURL URLWithString:@"itms-beta://"]; if ([[UIApplication sharedApplication] canOpenURL:customAppURL]) {     // TestFlight is installed     // Special link that includes the app's Apple ID     customAppURL = [NSURL URLWithString:@"https://beta.itunes.apple.com/v1/app/978489855"];      [[UIApplication sharedApplication] openURL:customAppURL]; } This special https://beta.itunes.apple.com URL will be opened directly in TestFlight. Finally, if you are using iOS 9 (or later), you need to make an addition to your Info.plist to get the canOpenURL: method to work. If your app is linked on or after iOS 9.0, you must declare the URL schemes you want to pass to this method. Do this by using the LSApplicationQueriesSchemes array in your Xcode project’s Info.plist file. For each URL scheme you wan...

Working natively with JavaScript in iOS and Android without WebView

Using JavaScript code from native code without using a WebView (sic!) can be really useful to introduce dynamic functionality that was updatable without need of updating the app shorter iteration cycles share code between backend and native iOS and Android apps You can have business logic provided by a JavaScript that then controls the app that inject native functionality in the JavaScript context. You could even write an A/B testing framework based on this approach. iOS iOS offers the native JavaScriptCore: Evaluate JavaScript programs from within an app, and support JavaScript scripting of your app. So you can evaluate a script and read its return value natively: context.evaluateScript(myLib); let result = context.evaluateScript("myFunction();") let myFunction = context.objectForKeyedSubscription("myFunction"); let parametrizedResult = myFunction.invokeMethod(...) Or you can inject a native object into the JavaScript engine: @objc protoco...

Validity Time Auto-Renewables in Sandbox

The subscription durations, sandbox durations and incentive durations of auto-renewables. Hint: In Sandbox the validity time differs from live environment!!! Durations Sandbox Duration Incentive Durations (optional) 7 days 3 minutes 7 days 1 month 5 minutes 7 days, 1 month 2 months 10 minutes 7 days, 1 month 3 months 15 minutes 1 month 6 months 30 minutes 1 month, 2 months 1 year 1 hour 1 month, 2 months, 3 months After 6 extensions the abo is cancelled automatically in the sandbox environment.

Xcode 7.2: Refactoring not supported for Swift... but there is a plugin!

but... there is a plugin for that: Refactorator GitHub

How to access specific settings in the iOS settings app

Apple Settings App Open the preference / settings app. You can open the app at different pages Native application URL string example: prefs:root=General&path=Bluetooth Extended example: Tags: settings preferences Airplane mode: prefs:root=AIRPLANE_MODE Bluetooth: prefs:root=General&path=Bluetooth Brightness: prefs:root=Brightness Location services: prefs:root=LOCATION_SERVICES Location services (System services): prefs:root=LOCATION_SERVICES_Systemservices Hotspots: prefs:root=Hotspot WLAN: prefs:root=WIFI UMTS-Settings: prefs:root=General&path=Network Mobile data: prefs:root=General&path=USAGE/CELLULAR_USAGE VPN: prefs:root=General&path=Network/VPN Sound: prefs:root=Sounds Rigntone: prefs:root=Sounds&path=Ringtone Siri speech settings: prefs:root=General&path=Assistant handleopenurl.com

Bundeskartellamt prรผft Apples Tracking-Regelungen fรผr Dritt-Apps (ATT, App Tracking Transparency Framework)

Das Bundeskartellamt hat gegen das Technologieunternehmen Apple ein Verfahren zur kartellrechtlichen Prรผfung seiner Tracking-Regelungen sowie des App Tracking Transparency Framework eingeleitet. Das Bundeskartellamt geht dabei insbesondere dem Anfangsverdacht nach, dass diese Regelungen Apples eigene Angebote bevorzugt behandeln und/oder andere Unternehmen behindern kรถnnten. 14.06.2022 Pressemeldung Bundeskartellamt

Tips for working with Firebase Remote Config

Caching As long as we're talking about loading strategies, let me hit on a related topic; caching. It sometimes confuses developers that values from remote config are cached for 12 hours instead of being grabbed immediately every time you call fetch(). And while you can reduce this cache time somewhat, if you start making network calls too frequently, your app might start getting throttled, either by the client, or the Remote Config service. Obviously, while you're developing and testing your Remote Config implementation, this can be inconvenient, which is why you can override the local throttling behavior by turning on developer mode . Force Update of Remote Config With Firebase Cloud Messaging, you can send a data-only notification to all of your devices, letting them know that there's an urgent update pending. Your apps can respond to this incoming notification by storing some kind of flag locally. The next time your user starts up your app, it can look for thi...