web-dev-qa-db-fra.com

Changer de thème à l'échelle de l'application par programme?

J'essaie d'obtenir un thème choisi par l'utilisateur et je me sens frustré. Définition du thème dans AndroidManifest.xml fonctionne comme il se doit, mais (autant que je sache) ne peut pas changer en fonction des préférences de l'application:

<application 
    Android:theme="@style/theme_sunshine" 
    Android:icon="@drawable/icon" 
    Android:label="@string/app_name">

Alternativement, le définir dynamiquement dans chaque activité fonctionne également:

someChosenTheme = PreferenceManager.getDefaultSharedPreferences(this).getString("themePreference", "theme_twilight");
setTheme(someOtherChosenTheme);

Mais cela semble désordonné, et je préfère définir le thème de l'application entière en un seul endroit. Ma première pensée a été de saisir le contexte de l'application dès le lancement de mon activité principale et de le faire là-bas:

getApplicationContext().setTheme(R.style.theme_dummy);

Du mieux que je puisse dire, this devrait faire l'affaire, mais en fait, il ne fait rien - l'application entière a le style par défaut Android. Est-ce que ce qui précède est valide et si oui, pourrais-je faire autre chose de stupide?

Je travaille en API niveau 3 si cela importe. Prods dans la bonne direction grandement apprécié!

Question connexe.

38
Cheezmeister

Créez une activité de base pour votre application et remplacez onCreate pour définir le thème. Tirez toutes vos autres activités de cette activité de base.

Consultez également ce tutoriel:

http://www.androidengineer.com/2010/06/using-themes-in-Android-applications.html

31
peter3

Il peut y avoir une bonne solution à cela, mais je n'en ai pas trouvé, donc j'ai fini par créer une petite méthode d'assistance statique dans une classe d'assistance qui prend une activité et exécute essentiellement les deux lignes que vous avez écrites. Bien sûr, ce n'est pas parfait, mais simplement ajouter une courte ligne de code à chaque méthode onCreate() dans mon application était tolérable.

5
EboMike