In Android 10 e versioni successive, un'app può supportare un tema scuro e passare automaticamente dal tema chiaro a quello scuro in base al tema di sistema. Per abbinarsi al tema dell'app corrente, i contenuti web in WebView possono utilizzare anche stili chiari, scuri o predefiniti.
Il comportamento di WebView è interoperabile con gli standard web di
prefers-color-scheme
e
color-scheme
. Se possibile, se sei l'autore dei contenuti web che vuoi che la tua app mostri in WebView, devi definire un tema scuro per il tuo sito web e implementare prefers-color-scheme
in modo che WebView possa abbinare il tema dei contenuti web al tema della tua app.
La tabella seguente descrive in che modo WebView esegue il rendering dei contenuti web nella tua app, a seconda dello stile dei contenuti web e delle condizioni dell'app:
Condizioni per le app | Contenuti web che utilizzano prefers-color-scheme |
Contenuti web che non utilizzano prefers-color-scheme |
---|---|---|
L'app utilizza un tema chiaro con
isLightTheme
impostato su true o non impostato. |
WebView esegue il rendering dei contenuti con il tema chiaro definito dall'autore dei contenuti. | WebView esegue il rendering dei contenuti con lo stile predefinito definito dall'autore dei contenuti. |
L'app utilizza Forza scuro per applicare algoritmicamente un tema scuro all'app. | WebView esegue il rendering dei contenuti con il tema scuro definito dall'autore dei contenuti. | Se consentito dall'autore dei contenuti, WebView esegue il rendering dei contenuti con un tema scuro generato utilizzando un algoritmo. |
L'app utilizza un tema scuro con
isLightTheme
impostato su false e l'app non consente il oscuramento algoritmico
per WebView. |
WebView esegue il rendering dei contenuti con il tema scuro definito dall'autore dei contenuti. | WebView esegue il rendering dei contenuti con lo stile predefinito definito dall'autore dei contenuti. |
L'app utilizza un tema scuro con
isLightTheme
impostato su false e consente
l'oscuramento algoritmico per WebView. |
WebView esegue il rendering dei contenuti con il tema scuro definito dall'autore dei contenuti. | Se consentito dall'autore dei contenuti, WebView esegue il rendering dei contenuti con un tema scuro generato utilizzando un algoritmo. |
Stile dell'autore dei contenuti
L'attributo
isLightTheme
di un'app indica se il tema è chiaro o scuro. WebView imposta sempre
prefers-color-scheme
in base a isLightTheme
. Se isLightTheme
è true
o non specificato, prefers-color-scheme
è light
; altrimenti è
dark
.
Ciò significa che se i contenuti web utilizzano prefers-color-scheme
e l'autore lo consente, il tema chiaro o scuro definito dall'autore viene sempre applicato automaticamente ai contenuti web in modo che corrispondano al tema dell'app.
Oscuramento degli algoritmi
Per coprire i casi in cui i contenuti web non utilizzano
prefers-color-scheme
,
la tua app può consentire a WebView, se necessario, di applicare in modo algoritmico un tema
scuro ai contenuti web che vengono visualizzati.
Se la tua app utilizza Force Dark a livello di app per applicare un tema scuro tramite algoritmo, consulta la seguente sezione che descrive come consentire il darkening algoritmico per i contenuti web con Force Dark.
Se la tua app non utilizza la modalità Forza scuro, il modo in cui specifica quando consentire l'oscuramento algoritmico in WebView dipende dal livello API target dell'app. Per informazioni dettagliate sulle app destinate ad Android 13 o versioni successive e sulle app destinate ad Android 12 o versioni precedenti, consulta le sezioni seguenti.
Consentire l'oscuramento algoritmico per i contenuti web con il tema scuro forzato
Se la tua app utilizza la modalità Forza modalità scura a livello di app, WebView applica l'oscuramento algoritmico ai contenuti web se sono soddisfatte le seguenti condizioni:
- WebView e i relativi elementi principali consentono la modalità Force Dark.
- Il tema dell'attività corrente è contrassegnato come chiaro con
isLightTheme
impostato sutrue
. - L'autore dei contenuti web non disattiva esplicitamente il oscuramento.
- Per le app che hanno come target Android 13 (livello API 33) o versioni successive, i contenuti web
non utilizzano
prefers-color-scheme
. - Per le app che hanno come target Android 12 (livello API 32) o versioni precedenti: l'app ha configurato l'impostazione
forceDarkMode
di WebView suFORCE_DARK_AUTO
e ha impostato la strategia Forza Buio suDARK_STRATEGY_USER_AGENT_DARKENING_ONLY
.
WebView e tutti i suoi elementi principali possono consentire l'applicazione forzata del tema scuro utilizzando
View.setForceDarkAllowed()
.
Il valore predefinito viene recuperato dall'attributo setForceDarkAllowed()
del
tema Android, che deve essere anch'esso impostato su true
.
La modalità Buio forzata è fornita principalmente per la compatibilità con le versioni precedenti nelle app che non forniscono un tema scuro. Se la tua app utilizza Forza scuro, ti consigliamo di aggiungere il supporto per un tema scuro.
Consenti l'oscuramento algoritmico (app destinate ad Android 13 o versioni successive)
Per le app che non utilizzano Force Dark a livello di app e hanno come target Android 13 (livello API
33) o versioni successive, utilizza il metodo AndroidX
setAlgorithmicDarkeningAllowed()
e passa il valore true
per specificare che un componente WebView deve consentire il oscuramento
algoritmo. Questo metodo ha la compatibilità con le versioni precedenti
di Android.
WebView applica quindi l'oscuramento algoritmico se sono soddisfatte le seguenti condizioni:
- I contenuti web non utilizzano
prefers-color-scheme
. - L'autore dei contenuti web non disattiva esplicitamente il oscuramento.
Consenti l'oscuramento algoritmico (app destinate ad Android 12 o versioni precedenti)
Per le app che non utilizzano la modalità Scura forzata a livello di app e hanno come target Android 12 (livello API 32) o versioni precedenti, utilizza FORCE_DARK_ON
per consentire l'oscuramento algoritmico.
Utilizza FORCE_DARK_ON
insieme a
FORCE_DARK_OFF
se la tua app fornisce il proprio metodo per passare dal tema chiaro a quello scuro e viceversa,
ad esempio un elemento attivabile/disattivabile nell'interfaccia utente o una selezione automatica in base all'ora.
Per verificare se la funzionalità è supportata, aggiungi le seguenti righe di codice
ovunque configuri l'oggetto WebView, ad esempio in Activity.onCreate
:
Kotlin
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { WebSettingsCompat.setForceDark(...) }
Java
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { WebSettingsCompat.setForceDark(...); }
Se la tua app si basa sul rilevamento delle modifiche alle preferenze di sistema, deve monitorare esplicitamente le modifiche del tema e applicarle a WebView con gli stati FORCE_DARK_ON
e FORCE_DARK_OFF
.
Il seguente snippet di codice mostra come modificare il formato del tema:
Kotlin
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { when (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) { Configuration.UI_MODE_NIGHT_YES -> { WebSettingsCompat.setForceDark(myWebView.settings, FORCE_DARK_ON) } Configuration.UI_MODE_NIGHT_NO, Configuration.UI_MODE_NIGHT_UNDEFINED -> { WebSettingsCompat.setForceDark(myWebView.settings, FORCE_DARK_OFF) } else -> { // } } }
Java
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { switch (getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) { case Configuration.UI_MODE_NIGHT_YES: WebSettingsCompat.setForceDark(myWebView.getSettings(), FORCE_DARK_ON); break; case Configuration.UI_MODE_NIGHT_NO: case Configuration.UI_MODE_NIGHT_UNDEFINED: WebSettingsCompat.setForceDark(myWebView.getSettings(), FORCE_DARK_OFF); break; } }
Personalizzare la gestione del tema scuro
Puoi anche utilizzare l'API ForceDarkStrategy in AndroidX per controllare il modo in cui l'oscuramento viene applicato a un determinato WebView. Questa API è
applicabile solo se il oscuramento forzato è impostato su FORCE_DARK_ON
o FORCE_DARK_AUTO
.
Con l'API, la tua app può utilizzare l'oscuramento del tema web o l'oscuramento dello user agent:
- Appiattimento del tema web: gli sviluppatori web potrebbero applicare
@media (prefers-color-scheme: dark)
per controllare l'aspetto della pagina web in modalità scura. WebView esegue il rendering dei contenuti in base a queste impostazioni. Per saperne di più sull'oscuramento del tema web, consulta la specifica. - Oscuramento dell'user-agent: WebView inverte automaticamente i colori della pagina web. Se utilizzi l'oscuramento dello user agent, la query
@media (prefers-color-scheme: dark)
viene valutata comefalse
.
Per scegliere tra le due strategie, utilizza la seguente API:
Kotlin
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK_STRATEGY)) { WebSettingsCompat.setForceDarkStrategy(...) }
Java
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK_STRATEGY)) { WebSettingsCompat.setForceDarkStrategy(...); }
Le opzioni di strategia supportate sono:
DARK_STRATEGY_PREFER_WEB_THEME_OVER_USER_AGENT_DARKENING
: questa è l'opzione predefinita. Anche se la maggior parte dei browser considera il tag<meta name="color-scheme" content="dark light">
come facoltativo, la modalità predefinita di Android WebView richiede che il meta tag rispetti leprefers-color-scheme
query multimediali della pagina web. Puoi utilizzare le WebView con la modalitàDARK_STRATEGY_WEB_THEME_DARKENING_ONLY
, in questo caso WebView applica sempre le query sui media anche se il tag è omesso.Tuttavia, consigliamo agli sviluppatori web di aggiungere il tag
<meta name="color-scheme" content="dark light">
ai propri siti web per garantire il rendering corretto dei contenuti nelle visualizzazioni web con la configurazione predefinita.DARK_STRATEGY_USER_AGENT_DARKENING_ONLY
: chiamato "oscuramento dell'user-agent", WebView ignora l'oscuramento della pagina web e applica l'oscuramento automatico.
Se la tua app mostra contenuti web proprietari personalizzati con la query mediaprefers-color-scheme
, ti consigliamoDARK_STRATEGY_WEB_THEME_DARKENING_ONLY
di assicurarti che WebView utilizzi il tema personalizzato.
Per un esempio di applicazione del tema scuro, consulta la demo di WebView su GitHub.