Android-changer par programme l'état d'un commutateur sans déclencher oncheckchanged écouteur
je suis à la recherche d'une méthode de modification programmatique de l'état D'un widget Android Switch en utilisant switch.setChecked(true);
sans déclencher OnCheckedChangedlistener
.
Ma première pensée a été de l'échanger contre un OnClickListener
mais comme cela enregistre uniquement les clics et que vous pouvez non seulement cliquer mais aussi faire glisser un interrupteur, ce N'est pas vraiment adapté comme si l'utilisateur devait faire glisser le commutateur de off à on alors le commutateur ne ferait rien car l'utilisateur ne clique pas...
Si quelqu'un a une solution ou un travail intelligent pour cela, ce serait génial
6 réponses
Eh bien, juste avant de faire des choses dans le code avec le commutateur, vous pouvez simplement annuler l'enregistrement de l'écouteur, puis faire tout ce dont vous avez besoin, et à nouveau enregistrer l'écouteur.
Définissez l'écouteur sur null avant d'appeler setCheck () function, et Activez Après cela, par exemple:
switch.setOnCheckedChangeListener (null);
switch.setChecked(true);
switch.setOnCheckedChangeListener (this);
Référence : Change la valeur de la case à cocher sans déclencher onCheckChanged
J'ai une solution et ça marche bien à ma fin. J'ai ajouté setOnTouchListener et setOnCheckedChangeListener sur mon contrôle de commutateur, et ajouté le code suivant pour résoudre mon problème.
// set tag by default.
mMySwitch.setTag("TAG");
// Add OnCheckedChangeListener.
mMySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (mMySwitch.getTag() != null) {
mMySwitch.setTag(null);
return;
}
// Do your stuff here.
}
});
// Add Touch listener.
mMySwitch.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mMySwitch.setTag(null);
return false;
}
});
De cette façon, setOnCheckedChangeListener n'est appelé que lorsque la vérification changée se produit par une intervention humaine par glisser, par clic, par toucher.
N'oubliez pas non plus d'ajouter votre balise de chaîne valide ( non null ) lorsque vous essayez de changer l'état de contrôle du commutateur. comme :
mMySwitch.setTag("TAG");
mMySwitch.setChecked(true);
Un moyen réutilisable consiste à écrire un commutateur personnalisé ou SwitchCompat et à remplacer setOnCheckedListener.
public class SwitchCompat extends android.support.v7.widget.SwitchCompat {
private boolean mIgnoreCheckedChange = false;
public SwitchCompat(Context context) {
super(context);
}
public SwitchCompat(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SwitchCompat(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public void setOnCheckedChangeListener(final OnCheckedChangeListener listener) {
super.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (mIgnoreCheckedChange) {
return;
}
listener.onCheckedChanged(buttonView, isChecked);
}
});
}
public void setChecked(boolean checked, boolean notify) {
mIgnoreCheckedChange = !notify;
setChecked(checked);
mIgnoreCheckedChange = false;
}
}
Développer la réponse de Mahmoud
CompoundButton.OnCheckedChangeListener switchListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
switchListener = new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
//Implement on check change
}
};
switch.setOnCheckedChangeListener (switchListener);
//When you want to trigger the checked of switch do the following
switch.setOnCheckedChangeListener (null);
switch.setChecked(true);
switch.setOnCheckedChangeListener (switchListener);
}
`
Ajoutez simplement ceci à votre code:
activity.recreate();