2 votes

Android - L'interrupteur reste coché après un changement d'orientation

L'interrupteur reste coché après le changement d'orientation, même si j'ai défini par programme checked false.

Voici un exemple de code :

public class MainActivity extends AppCompatActivity {

    Switch sw;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        sw = (Switch)findViewById(R.id.sw);
        sw.setChecked(false);

        System.out.println(sw.isChecked());
    }    
}

The sout imprime false, mais le commutateur continue de vérifier l'interface. Il s'agit de l'élément xml de l'interrupteur dans le fichier de mise en page :

<Switch
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/sw"
    android:checked="false"/>

Qu'est-ce que je manque ?

0voto

Illdapt Points 1807

La raison pour laquelle votre case n'est pas cochée sur Orientation Change est qu'Android déclenche des méthodes d'activité sur Orientation Change comme suit :

onPause -> onSave -> onStop -> onCreate -> onStart -> onResume

Si vous voulez sw.setChecked(false); à déclencher lors du changement d'orientation, placez-la dans la fonction onResume() de vos activités comme suit :

//Other Code Above, i.e. onCreate();
@Override
public void onResume(){
    super.onResume();
    // Put your code here...
    sw.setChecked(false);
}

Il existe également d'autres options pour empêcher le redémarrage de l'activité. Documentation Android sous Modifications de la configuration

Dans certains cas particuliers, il peut être souhaitable de ne pas tenir compte des éléments suivants en fonction d'un ou de plusieurs types de changements de configuration. C'est ce que avec l'attribut Android:configChanges dans son manifeste. Pour tous les types de changements de configuration que vous dites gérer ici, vous pourrez recevrez un appel à la fonction onConfigurationChanged(Configuration) de votre activité actuelle au lieu d'être redémarrée. Si un changement de configuration implique un type de changement que vous ne gérez pas, l'appel à la méthode vous ne gérez pas, l'activité sera quand même redémarrée et la méthode onConfigurationChanged(Configuration) ne sera pas appelée. redémarré.

Et enfin une autre option via onSaveInstanceState(Bundle savedInstanceState) y onRestoreInstanceState(Bundle savedInstanceState) :

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
  savedInstanceState.putBoolean("YourCheckBox", enable);
  super.onSaveInstanceState(savedInstanceState);
}

Et le récupérer en utilisant cette méthode :

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
  super.onRestoreInstanceState(savedInstanceState);
  boolean mychkbox = savedInstanceState.getBoolean("YourCheckBox");
}

0voto

John O'Reilly Points 5188

De manière plus générale, vous souhaiterez probablement remplacer les éléments suivants afin de préserver un état tel que celui-ci lorsque l'orientation change (et que l'activité est recréée)

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBoolean(SOME_BOOL_VALUE, boolVar);
}

et l'a lu à l'époque dans onCreate si savedInstanceState est défini

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