Sto utilizzando il nuovo tema Theme.AppCompat.DayNight di AppCompat introdotto in version 23.2, ma invece di passare automaticamente da un tema di giorno (chiaro) a quello di notte (scuro), viene sempre visualizzato come tema di luce. Come posso farlo passare a un tema oscuro?AppCompat DayNight viene sempre visualizzato come tema Light?
risposta
Come specificato nel that same 23.2 blog post,
Per impostazione predefinita, se si tratta di 'notte' corrisponderà al valore di sistema (da UiModeManager.getNightMode())
Tuttavia, fin d'ora, Questo significa che è equivalente a MODE_NIGHT_NO
poiché l'unica cosa che attiva la modalità notturna sono i dock per auto dell'era Gingerbread.
Ciò significa che sui dispositivi attuali, l'unico modo per vedere un tema scuro quando si utilizza un tema DayNight è quello di utilizzare NIGHT_MODE_YES o NIGHT_MODE_AUTO
Come indicato in entrambe le ufficiali a posteriori e Chris Banes' post on DayNight, è possibile modificare la modalità a livello globale o locale.
Il livello globale si basa sul metodo statico AppCompatDelegate.setDefaultNightMode()
, che imposta la modalità DayNight sull'intera app. Poiché ciò si applica solo mentre il tuo processo è attivo (cioè, è solo un flag in memoria), devi assicurarti di impostarlo ogni volta che la tua applicazione viene avviata. Un approccio raccomandato dal post di Chris' per farlo è quello di impostare in un metodo statico della classe applicazione personalizzata:
static {
AppCompatDelegate.setDefaultNightMode(
AppCompatDelegate.MODE_NIGHT_...);
}
public class MyApplication extends Application {
Se, invece, si vuole solo cambiare la modalità per una singola attività/finestra di dialogo, è può invece chiamare getDelegate().setLocalNightMode()
:
public class MyActivity extends AppCompatActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
// Set the local night mode to some value
getDelegate().setLocalNightMode(
AppCompatDelegate.MODE_NIGHT_...);
// Now recreate for it to take effect
recreate();
}
}
}
Questo cambia solo la singola istanza - si noterà la chiamata a recreate()
- Visualizzazioni già gonfiati non saranno interessati da un cambiamento nella modalità notte, in modo da poter forzare l'attività da ricreare per ottenere i valori aggiornati.
Naturalmente, dopo Chris' afferma anche
Ricordo inoltre che il valore predefinito è MODE_NIGHT_FOLLOW_SYSTEM, quindi se si aggiunge un ambiente user-visibile alla piattaforma in futuro, AppCompat verrà automaticamente usarlo.
Per modificare altri attributi quando è giorno o notte, controlla [questa risposta] (http://stackoverflow.com/a/35629740/1676363) che spiega come usare la cartella delle risorse 'night' e' notnight' S. – ianhanniballake
Sembra che ci sia un bug in Android Lollipop con AppCompat 23.2.0: Google Issue Tracker
Il seguente codice funziona solo pre-Lollipop:
public class MyApplication extends Application {
static {
AppCompatDelegate.setDefaultNightMode(
AppCompatDelegate.MODE_NIGHT_YES);
}
[...]
}
Credo che questa sia la corretta answer: http://stackoverflow.com/a/35701225/859190 – mariotaku