Le thème change dans l'activité actuelle (activité Paramètres), mais je dois redémarrer les autres activités d'arrière-plan pour appliquer le nouveau thème. Je pense que les activités en arrière-plan devraient être redémarrées dans l'activité des paramètres, mais je ne trouve pas comment.
Voici mon activité relative aux paramètres:
public class SettingsActivity extends FragmentActivity implements SharedPreferences.OnSharedPreferenceChangeListener { private SharedPreferences prefs; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SettingsHelper.onActivityCreateSetTheme(this); getSupportFragmentManager() .beginTransaction() .replace(android.R.id.content, new SettingsFragment()) .commit(); prefs = PreferenceManager.getDefaultSharedPreferences(this); } @Override protected void onResume() { super.onResume(); prefs.registerOnSharedPreferenceChangeListener(this); } @Override protected void onPause() { super.onPause(); prefs.unregisterOnSharedPreferenceChangeListener(this); } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if (key.equals("theme")) { boolean isDark = prefs.getBoolean("theme", false); prefs.edit().putBoolean("theme", isDark).apply(); SettingsHelper.changeToTheme(this); } }
4 Réponses :
Dans toutes vos activités, essayez de mettre le code ci-dessous dans la méthode onResume ():
@Override public void onResume(){ super.onResume(); boolean isDark = prefs.getBoolean("theme", false); if(!isDark){ recreate(); } }
recréer () doit être appelé pour recréer l'activité afin que le nouveau thème peut être appliqué sur l'écran actuel.
Je vais essayer cette approche
vous pouvez simplement terminer cette activité pour que le prochain démarrage utilise le nouveau thème.
ou si votre thème peut être appliqué manuellement, vous pouvez appliquer le nouveau thème à son onResume
(ou onStart
, selon votre logique).
Vous pouvez également recréer l'activité à onResume
(si le thème a changé) mais je ne le recommande pas car ce CV sera inutile et vous pouvez simplement utiliser la première option.
D'après ce que j'ai lu, je ne peux appliquer un thème à une autre activité que sur onCreate (), appeler setTheme dans onStart () ou onResume () ne change pas mon thème.
Non, vous m'avez mal compris. Je ne dis pas d'utiliser setTheme
à onResume
ou onStart
Je voulais dire que si votre application change ses couleurs uniquement par exemple et ne pas réinitialiser le tout le thème de l'activité, cela peut être fait manuellement à ces méthodes. mais comme votre application semble nécessiter la réinitialisation de son thème d'activité, vous pouvez choisir l'une des deux autres options
switch (cTheme) { case BLACK: int myTheme = R.style.Default activity.setTheme(myTheme); //Save your activity theme color saveTheme(myTheme); break; case YELLOW: int myTheme = R.style.Green activity.setTheme(myTheme); //Save your activity theme color saveTheme(myTheme); break; } and change your onActivityCreateSetTheme(Activity activity) to: public static void onActivityCreateSetTheme(Activity activity, Int cTheme) Save method public void saveTheme(int theme) { SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); SharedPreferences.Editor editor = sharedPreferences.edit(); prefEditor.putInt("Theme",theme); } Load method public int loadTheme(){ SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); //Load theme color int theme = sharedPreferences.getInt("Theme",Color.RED); //RED is default color, when nothing is saved yet return theme; } Important: call loadTheme() before setContentView() so your onCreate() should be like: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); int theme = loadTheme(); //Load your theme here!!!! CustomazationProcess.onActivityCreateSetTheme(this, theme); setContentView(R.layout.something1); findViewById(R.id.black).setOnClickListener(this); findViewById(R.id.yellow).setOnClickListener(this); }
Bonjour Dishant, les réponses par code uniquement ne sont pas recommandées. Je vous suggère d'ajouter plus de détails et d'explications afin que nous puissions comprendre que vous répondez très bien
J'ai une classe d'assistance qui fait cela, mais je dois appeler toutes mes activités soit dans (onStart ou onResume) une méthode de recréation, mais cela entre dans une boucle infinie, d'où la question.
La réponse était en effet de recréer l'activité mais seulement après avoir vérifié que la valeur obtenue onCreate est différente de celle onResume. Lien vers une question SO connexe: Actualiser (recréer) les activités dans la pile arrière lors du changement de paramètres régionaux au moment de l'exécution
@Override protected void onCreate() { super.onCreate() preferences = PreferenceManager.getDefaultSharedPreferences(this); isDark = preferences.getBoolean("theme", false); } @Override protected void onResume() { super.onResume(); if(isDark != preferences.getBoolean("theme", false)) recreate(); }