1
votes

Comment puis-je conserver mes paramètres de thème dans l'application Android?

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);
        }
    }


0 commentaires

4 Réponses :


0
votes

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.


1 commentaires

Je vais essayer cette approche



0
votes

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.


2 commentaires

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



1
votes
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);
}

2 commentaires

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.



1
votes

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();
    }


0 commentaires