web-dev-qa-db-fra.com

Android - Changez le thème de l'application sur onClick

je sais qu'il existe un moyen de changer le thème par défaut de l'application en cliquant sur le bouton. Les développeurs Blackmart l'ont fait. J'ai déjà effectué des recherches sur Google dans un millier de pages, mais j’ai trouvé que cela ne fonctionnait pas.

getApplication().setTheme(Theme.Holo)

Comme j'ai déjà créé un nouveau style dans res/values ​​/ styles.xml, existe-t-il un autre moyen de le changer de manière dynamique? Même en redémarrant l'application?

48
user2606414

Le blog suivant peut résoudre votre problème:

http://mrbool.com/how-to-change-the-layout-theme-of-an-Android-application/25837

Copier le code du blog pour une référence rapide:

En supposant que vous ayez déjà défini les trois thèmes suivants dans le fichier XML R.style.FirstTheme, R.style.SecondTheme et R.style.ThirdTheme

import Android.app.Activity;
import Android.os.Bundle;
import Android.view.View;
import Android.view.View.OnClickListener;
public class ChangeThemeActivity extends Activity implements OnClickListener
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        Utils.onActivityCreateSetTheme(this);
        setContentView(R.layout.main);

                    findViewById(R.id.button1).setOnClickListener(this);
          findViewById(R.id.button2).setOnClickListener(this);
          findViewById(R.id.button3).setOnClickListener(this);
    }
     @Override
     public void onClick(View v)
     {
          // TODO Auto-generated method stub
          switch (v.getId())
          {
          case R.id.button1:
          Utils.changeToTheme(this, Utils.THEME_DEFAULT);
          break;
          case R.id.button2:
          Utils.changeToTheme(this, Utils.THEME_WHITE);
          break;
          case R.id.button3:
          Utils.changeToTheme(this, Utils.THEME_BLUE);
          break;
          }
     }
}

Écrivons le code ci-dessous dans le fichier "Utils":

import Android.app.Activity;
import Android.content.Intent;
public class Utils
{
     private static int sTheme;
     public final static int THEME_DEFAULT = 0;
     public final static int THEME_WHITE = 1;
     public final static int THEME_BLUE = 2;
     /**
      * Set the theme of the Activity, and restart it by creating a new Activity of the same type.
      */
     public static void changeToTheme(Activity activity, int theme)
     {
          sTheme = theme;
          activity.finish();
activity.startActivity(new Intent(activity, activity.getClass()));
     }
     /** Set the theme of the activity, according to the configuration. */
     public static void onActivityCreateSetTheme(Activity activity)
     {
          switch (sTheme)
          {
          default:
          case THEME_DEFAULT:
              activity.setTheme(R.style.FirstTheme);
              break;
          case THEME_WHITE:
              activity.setTheme(R.style.SecondTheme);
              break;
          case THEME_BLUE:
              activity.setTheme(R.style.Thirdheme);
              break;
          }
     }
}

J'espère que ça aide...

EDIT 1:

voici la raison pour laquelle AlertDialog ne prend pas de thème personnalisé:

L'implémentation dans Builder.create () est:

public AlertDialog create() {
    final AlertDialog dialog = new AlertDialog(P.mContext);
    P.apply(dialog.mAlert);
    [...]
}

qui appelle le constructeur "non-theme-aware" de AlertDialog, qui ressemble à ceci:

protected AlertDialog(Context context) {
    this(context, com.Android.internal.R.style.Theme_Dialog_Alert);
}

Il existe un second constructeur dans AlertDialog pour changer de thème:

protected AlertDialog(Context context, int theme) {
    super(context, theme);
    [...]
}

que le constructeur n'appelle pas.

Consultez le post suivant pour des corrections plus pertinentes.

Comment changer de thème pour AlertDialog

Voici la réponse la plus votée:

  new AlertDialog.Builder(
  new ContextThemeWrapper(context, Android.R.style.Theme_Dialog))
64
Praful Bhatnagar