Changer de theme de façon dynamique

Résolu
Bonjour à tous, je souhaiterais savoir si il existe un moyen de changer de thème dynamiquement, en fonction du choix de l'utilisateur, un peu comme ceci par exemple:

monLayout.setTheme(R.style.monTheme)


Merci à vous
Configuration: Linux / Firefox 82.0

6 réponses

  1. Modérateur
    Bonjour,

    Bien sûr, c'est possible de le faire, la doc

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

    0
    1. merci brunoCS je connaissais cette possibilité, mais comment faire si ma vue contient plusieurs layout comme ceci par exemple:

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical" android:layout_width="match_parent"
          android:layout_height="wrap_content">
      
          <RelativeLayout
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:id="@+id/layout1"
              android:theme="@style/fondBleu">
      
              <TextView
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:id="@+id/tv1"/>
      
          </RelativeLayout>
      
         <RelativeLayout
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:id="@+id/layout2"
              android:theme="@style/fondBleu">
      
              <TextView
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:id="@+id/tv2"/>
      
          </RelativeLayout>
      
           <RelativeLayout
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:id="@+id/layout3"
              android:theme="@style/fondBleu">
      
              <TextView
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:id="@+id/tv3"/>
      
          </RelativeLayout>
      </linearLayout>
      


      et que je ne veuille changer le style que d'un seul layout en fonction du choix de l'utilisateur?
      j'avais penser à créer un Intent pour sauvegarder le chois de l'utilisateur, puis de redémarrer l'activité ensuite en récupérant ces choix. Mais je ne pense vraiment pas que ce soit la meilleur façon de faire.
      0
      1. Modérateur
        Un thème s'utilise sur l'app ou sur une Activity en globalité. Ce que tu veux, c'est changer le style d'une partie de l'écran ? Tu vas être obligé de recharger l'écran car le style s'applique au constructeur du composant graphique

        TextView(this, null, 0, R.style.style)


        j'avais penser à créer un Intent pour sauvegarder le chois de l'utilisateur, puis de redémarrer l'activité ensuite en récupérant ces choix. Mais je ne pense vraiment pas que ce soit la meilleur façon de faire.
        Si, ça me parait bien. Sinon, l'autre solution est de supprimer toutes les vues et de les recréer une par une...
        0
        1. Merci Bruno pour ces explications. Une dernière ptite question pour la route,
          j'ai créer une ListView qui est générée à partir d'un class qui dérive de BaseAdapter

          <?xml version="1.0" encoding="utf-8"?>
          <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical" android:layout_width="match_parent"
          android:layout_height="wrap_content">
          
              <RelativeLayout
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:id="@+id/monRelativeLayout"
                  android:theme="@style/fondBleu">
              
                  <Button
                      android:layout_width="wrap_content"
                      android:layout_height="wrap_content"
                      android:id="@+id/monBouton"/>
              
              </RelativeLayout>
              
              <ListView
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:id="@+id/listeTheme"/>
              
          </LinearLayout>
          


          est -il possible d'appliquer un style différent pour chaque RelativeLayout?
          0
          1. Modérateur
            Désolé, je ne fais pas le lien entre ta
            ListView
            et tes
            RelativeLayout
            mais oui, (quasiment) tout est possible ;)

            0
            1. Ok je vais creuser un peu. Merci Bruno pour ces éclaircissements.
              0