143 votes

Changer le thème de l'activité de manière programmatique

Dans certains cas, j'ai besoin de supprimer le thème du dialogue de mon activité, mais cela ne semble pas fonctionner. Voici un exemple

Première activité :

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    startActivity(new Intent(MainActivity.this, SecondActivity.class));
}

Deuxième activité :

public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setTheme(android.R.style.Theme);
    setContentView(R.layout.activity_second);
}

Extrait du manifeste :

 <activity android:name="SecondActivity" android:theme="@android:style/Theme.Dialog"></activity>

Quand je l'exécute, il y a toujours un thème de dialogue.

API10

Merci.

217voto

user1462299 Points 4089

Comme docs dire que vous devez appeler setTheme avant toute sortie de vue. Il semble que super.onCreate() participe à view traitement.

Ainsi, pour passer d'un thème à l'autre de manière dynamique, il suffit d'appeler setTheme avant super.onCreate comme ça :

public void onCreate(Bundle savedInstanceState) {
    setTheme(android.R.style.Theme);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);
}

60voto

bjornson Points 632

La réponse de l'utilisateur1462299 fonctionne très bien, mais si vous incluez des fragments ils utiliseront le thème des activités originales. Pour appliquer le thème à tous les fragments également, vous pouvez Remplacer la fonction getTheme() du Contexte à la place :

@Override
public Resources.Theme getTheme() {
    Resources.Theme theme = super.getTheme();
    if(useAlternativeTheme){
        theme.applyStyle(R.style.AlternativeTheme, true);
    }
    // you could also use a switch if you have many themes that could apply
    return theme;
}

Vous n'avez plus besoin d'appeler setTheme() dans la méthode onCreate(). De cette façon, vous surchargez chaque requête pour obtenir le thème actuel dans ce contexte.

14voto

dondondon Points 743

Je sais que je suis en retard mais j'aimerais poster une solution ici :
Consultez le code source complet ici .
Voici le code que j'ai utilisé pour changer de thème en utilisant les préférences

SharedPreferences pref = PreferenceManager
        .getDefaultSharedPreferences(this);
String themeName = pref.getString("prefSyncFrequency3", "Theme1");
if (themeName.equals("Africa")) {
    setTheme(R.style.AppTheme);

} else if (themeName.equals("Colorful Beach")) {
    //Toast.makeText(this, "set theme", Toast.LENGTH_SHORT).show();
    setTheme(R.style.beach);

} else if (themeName.equals("Abstract")) {
    //Toast.makeText(this, "set theme", Toast.LENGTH_SHORT).show();

    setTheme(R.style.abstract2);

} else if (themeName.equals("Default")) {

    setTheme(R.style.defaulttheme);

}

Veuillez noter que vous devez placer le code avant setcontentview .

BON CODAGE !

5voto

Noby Ali Points 63

J'ai utilisé ce code pour implémenter le mode sombre... cela a bien fonctionné pour moi... Vous pouvez l'utiliser dans un switch on....listener...

//setting up Night Mode...
 AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
//Store current mode in a sharedprefernce to retrieve on restarting app
            editor.putBoolean("NightMode", true);
            editor.apply();
//restart all the activities to apply changed mode...
            TaskStackBuilder.create(getActivity())
                    .addNextIntent(new Intent(getActivity(), MainActivity.class))
                    .addNextIntent(getActivity().getIntent())
                    .startActivities();

4voto

Tamim Attafi Points 645

Celui-ci fonctionne bien pour moi :

theme.applyStyle(R.style.AppTheme, true)

Utilisation :

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    //The call goes right after super.onCreate() and before setContentView()
    theme.applyStyle(R.style.AppTheme, true)
    setContentView(layoutId)
    onViewCreated(savedInstanceState)
}

OU en utilisant setTheme(R.style.AppTheme_Light) :

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    //The call goes right after super.onCreate() and before setContentView()
    setTheme(R.style.AppTheme_Light)
    setContentView(R.layout.activity_main)
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X