2011-01-11 4 views
36

Je tente d'obtenir un thème choisi par l'utilisateur et se sentir comme si je suis frustrant. Définir le thème AndroidManifest.xml fonctionne comme il se doit, mais (comme je le peux dire) ne peut pas changer en fonction des préférences d'applications:Changement de thème à l'échelle de l'application par programme?

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

Vous pouvez également mettre 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 pour l'ensemble de l'application en un seul endroit. Ma première pensée était de saisir le contexte d'application dès que mes lancements principaux d'activité et de pratique:

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

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

Je travaille au niveau 3 de l'API si cela est important. Prods dans la bonne direction grandement appréciée!

Related question.

Répondre

30

Créez une activité de base pour votre application et remplacez la propriétéCréer pour définir le thème. Dérivez toutes vos autres activités de cette activité de base.

Vérifiez également ce tutoriel: http://www.androidengineer.com/2010/06/using-themes-in-android-applications.html

+0

Ceci est essentiellement ce que je fais. Ce n'est toujours pas idéal, car il n'y a pas d'héritage multiple, par ex. pour un ListActivity personnalisé, mais l'inconvénient est mineur. Didacticiel très utile, même si je l'ai déjà lu :) – Cheezmeister

+0

J'ai effectivement une BaseListActivity et une activité de base (générique) dans chaque application que je fais. Le BaseListActivity a la gestion commune de CRUD (lire, ajouter, éditer, supprimer) intégré, il est donc très facile de créer une nouvelle activité de liste et simplement remplacer quelques méthodes. Bien sûr, si j'ajoute une MapActivity ou TabActivity, je devrais aussi créer une BaseXActivity pour eux. Parfois, l'héritage multiple est juste meilleur :) – peter3

+5

Donc, ajouter setTheme pour chaque activité, avant que "setContentView" soit appelé est vraiment la bonne solution? n'y a-t-il pas une seule solution à l'échelle du système? aussi, que se passe-t-il avec toutes les activités qui sont déjà en vie? –

5

Il peut y avoir une bonne solution à cela, mais je ne pouvais pas trouver un, je fini par faire un peu de méthode d'assistance statique dans une classe d'aide qui prend une activité et réalise essentiellement ces deux lignes tu as écrit. Bien sûr, ce n'est pas parfait, mais juste ajouter une courte ligne de code à chaque méthode onCreate() dans mon application était tolérable.

Questions connexes