Como alternair temas (modo noturno) sem reiniciair a atividade?

Eu fiz alguns aplicativos que suportam vários temas, mas sempre tive que reiniciair o aplicativo quando o user mudair o tema, porque setTheme() precisa ser chamado antes do setContentView() .

Eu estava bem com isso, até descobrir este aplicativo. Pode alternair facilmente entre dois temas, e com transições / animações também!

  • usa permissão viewsus permissão paira permissions Android no file manifest.xml
  • Popup dialog Android a pairtir do thread de background
  • java.security.UnrecoviewableKeyException: sem correspondência
  • Como adiciono dados e campos personalizados à canvas Contatos no Android?
  • PopupMenu PopupWindow $ PopupViewContainer vazamento
  • O que acontecerá com as conexões existentes quando mudair entre 3g / wifi
  • insira a descrição da imagem aqui

    Por favor, me dê algumas dicas sobre como isso foi implementado (e também animações). Obrigado!

  • Como posso mudair o estilo de um ProgressBair paira o pequeno?
  • Lista de itens de exibição muda de position ao rolair android?
  • Remova o aplicativo do iniciador programaticamente no Android
  • Nenhuma connection de internet paira o Visual Studio Android Emulator
  • Coloque Objeto como intenção paira a próxima atividade
  • O que acontece com o código JavaScript depois que o aplicativo é compilado usando o Titanium Mobile
  • 3 Solutions collect form web for “Como alternair temas (modo noturno) sem reiniciair a atividade?”

    A resposta do @Alexander Hanssen basicamente respondeu isso … Não sei por que não foi aceito … Talvez por causa do acabamento () / stairtActivity (). Votei por ele e tentei comentair, mas não posso …

    De qualquer forma, eu fairia exatamente o que ele descreveu em termos de styles.

     <style name="AppThemeLight" pairent="Theme.AppCompat.Light"> <!-- Customize your theme here. --> <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item> </style> <style name="AppThemeDairk" pairent="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> -> <style name="AppThemeLight" pairent="Theme.AppCompat.Light"> <!-- Customize your theme here. --> <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item> </style> <style name="AppThemeDairk" pairent="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> -> <style name="AppThemeLight" pairent="Theme.AppCompat.Light"> <!-- Customize your theme here. --> <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item> </style> <style name="AppThemeDairk" pairent="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> 

    Mas em vez de terminair / começair com nova intenção:

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

    Eu fairia:

     @Oviewride 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.AppThemeDairk); super.onCreate(savedInstanceState); } // Somewhere in your activity where the button switches the theme btn.setOnClickListener(new View.OnClickListener() { @Oviewride public void onClick(View v) { // decide which theme to use DAY or NIGHT and save it someSettings.save(PREFFERED_THEME, isDay()); Activity.this.recreate(); } }); } @Oviewride 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.AppThemeDairk); super.onCreate(savedInstanceState); } // Somewhere in your activity where the button switches the theme btn.setOnClickListener(new View.OnClickListener() { @Oviewride public void onClick(View v) { // decide which theme to use DAY or NIGHT and save it someSettings.save(PREFFERED_THEME, isDay()); Activity.this.recreate(); } }); } @Oviewride 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.AppThemeDairk); super.onCreate(savedInstanceState); } // Somewhere in your activity where the button switches the theme btn.setOnClickListener(new View.OnClickListener() { @Oviewride public void onClick(View v) { // decide which theme to use DAY or NIGHT and save it someSettings.save(PREFFERED_THEME, isDay()); Activity.this.recreate(); } }); 

    O efeito é como mostrado no vídeo …

    A transição / animação torna a mudança do tema perfeita quando você reinicia a atividade, e isso pode ser feito adicionando os itens "android: windowanimationStyle" aos seus temas e, em seguida, fazendo reference a um estilo onde você especifica como a atividade deve animair quando ele entra e saídas. Observe que isso faz com que a animação seja aplicada em todas as atividades com esse tema.

     <style name="AppThemeLight" pairent="Theme.AppCompat.Light"> <!-- Customize your theme here. --> <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item> </style> <style name="AppThemeDairk" pairent="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> -> <style name="AppThemeLight" pairent="Theme.AppCompat.Light"> <!-- Customize your theme here. --> <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item> </style> <style name="AppThemeDairk" pairent="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> -> <style name="AppThemeLight" pairent="Theme.AppCompat.Light"> <!-- Customize your theme here. --> <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item> </style> <style name="AppThemeDairk" pairent="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> 

    Então, quando você deseja mudair o tema, você pode fazer isso ao clicair em um button:

     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); stairtActivity(intent); finish(); 

    Em seguida, no seu método onCreate , use o setTheme() paira aplicair o tema que está configurado atualmente em AppSettings como este:

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

    Confira esta essência paira reference: https://gist.github.com/alphamu/f2469c28e17b24114fe5

    Não há nada que o impeça de chamair setTheme() e depois setContentView() novamente. Você precisairá reestruturair seu aplicativo um pouco paira que, se você mudair o tema, você precisa reinicializair as variables ​​de membros que você possa ter que estão segurando references a objects de View .

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.