tema oscuro oreo nocturno modo activar android android-theme

nocturno - modo oscuro android oreo



¿Cómo cambiar de tema(modo nocturno) sin reiniciar la actividad? (3)

La respuesta de @Alexander Hanssen básicamente ha respondido esto ... No sé por qué no fue aceptada ... Tal vez por el final () / startActivity (). Voté a favor y traté de comentar pero no puedo ...

De todos modos, haría exactamente lo que él describió en términos de estilos.

<style name="AppThemeLight" parent="Theme.AppCompat.Light"> <!-- Customize your theme here. --> <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item> </style> <style name="AppThemeDark" parent="Theme.AppCompat"> <!-- Customize your theme here. --> <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item> </style> <!-- This will set the fade in animation on all your activities by default --> <style name="WindowAnimationTransition"> <item name="android:windowEnterAnimation">@android:anim/fade_in</item> <item name="android:windowExitAnimation">@android:anim/fade_out</item> </style>

Pero en lugar de terminar / comenzar con una nueva intención:

Intent intent = new Intent(this, <yourclass>.class); startActivity(intent); finish();

Yo lo haría:

@Override protected void onCreate(Bundle savedInstanceState) { // MUST do this before super call or setContentView(...) // pick which theme DAY or NIGHT from settings setTheme(someSettings.get(PREFFERED_THEME) ? R.style.AppThemeLight : R.style.AppThemeDark); super.onCreate(savedInstanceState); } // Somewhere in your activity where the button switches the theme btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // decide which theme to use DAY or NIGHT and save it someSettings.save(PREFFERED_THEME, isDay()); Activity.this.recreate(); } });

El efecto es el que se muestra en el video ...

He creado algunas aplicaciones que admiten varios temas, pero siempre tuve que reiniciar la aplicación cuando el usuario cambia de tema, porque setTheme() necesario llamar a setContentView() antes de setContentView() .

Estaba bien con eso, hasta que descubrí esta aplicación. ¡Puede cambiar sin problemas entre dos temas, y también con transiciones / animaciones!

Por favor, dame algunos consejos sobre cómo se implementó esto (y animaciones también). ¡Gracias!


La transición / animación hace que el tema cambie sin problemas cuando reinicia la actividad, y esto se puede hacer agregando los elementos "android: windowanimationStyle" a sus temas, y luego haciendo referencia a un estilo en el que especifique cómo se debe animar la Actividad cuando entra y salidas Tenga en cuenta que esto hace que la animación se aplique a todas las actividades con ese tema.

<style name="AppThemeLight" parent="Theme.AppCompat.Light"> <!-- Customize your theme here. --> <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item> </style> <style name="AppThemeDark" parent="Theme.AppCompat"> <!-- Customize your theme here. --> <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item> </style> <!-- This will set the fade in animation on all your activities by default --> <style name="WindowAnimationTransition"> <item name="android:windowEnterAnimation">@android:anim/fade_in</item> <item name="android:windowExitAnimation">@android:anim/fade_out</item> </style>

Luego, cuando desee cambiar de tema, puede hacer esto al hacer clic en un botón:

AppSettings settings = AppSettings.getInstance(this); settings.set(AppSettings.Key.USE_DARK_THEME, !settings.getBoolean(AppSettings.Key.USE_DARK_THEME)); Intent intent = new Intent(this, <yourclass>.class); startActivity(intent); finish();

Luego, en su método onCreate , use setTheme() para aplicar el tema que está configurado actualmente en AppSettings como este:

AppSettings settings = AppSettings.getInstance(this); setTheme(settings.getBoolean(AppSettings.Key.USE_DARK_THEME) ? R.style.AppThemeDark : R.style.AppThemeLight); super.onCreate(savedInstanceState); setContentView(<yourlayouthere>);

Echa un vistazo a este gist para referencia: https://gist.github.com/alphamu/f2469c28e17b24114fe5


No hay nada que le impida llamar a setTheme() y luego a setContentView() nuevo. Solo tendrá que reestructurar un poco su aplicación para que, si cambia el tema, deba reinicializar las variables miembro que pueda tener que tengan referencias a los objetos View .