Réponse 2 :
Une réponse très simple :
Utilisation sur OnClickListener au lieu de OnCheckedChangeListener
someCheckBox.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// you might keep a reference to the CheckBox to avoid this class cast
boolean checked = ((CheckBox)v).isChecked();
setSomeBoolean(checked);
}
});
Désormais, vous ne captez que les événements liés aux clics et vous n'avez plus à vous soucier des changements programmatiques.
Réponse 1 :
J'ai créé une classe enveloppante (voir le modèle de décorateur) qui gère ce problème de manière encapsulée :
public class BetterCheckBox extends CheckBox {
private CompoundButton.OnCheckedChangeListener myListener = null;
private CheckBox myCheckBox;
public BetterCheckBox(Context context) {
super(context);
}
public BetterCheckBox(Context context, CheckBox checkBox) {
this(context);
this.myCheckBox = checkBox;
}
// assorted constructors here...
@Override
public void setOnCheckedChangeListener(
CompoundButton.OnCheckedChangeListener listener){
if(listener != null) {
this.myListener = listener;
}
myCheckBox.setOnCheckedChangeListener(listener);
}
public void silentlySetChecked(boolean checked){
toggleListener(false);
myCheckBox.setChecked(checked);
toggleListener(true);
}
private void toggleListener(boolean on){
if(on) {
this.setOnCheckedChangeListener(myListener);
}
else {
this.setOnCheckedChangeListener(null);
}
}
}
CheckBox peut toujours être déclaré de la même manière en XML, mais utilisez-le lors de l'initialisation de votre interface graphique dans le code :
BetterCheckBox myCheckBox;
// later...
myCheckBox = new BetterCheckBox(context,
(CheckBox) view.findViewById(R.id.my_check_box));
Si vous voulez définir la vérification à partir du code sans déclencher l'écouteur, appelez myCheckBox.silentlySetChecked(someBoolean)
au lieu de setChecked
.
0 votes
Je ne suis pas certain, mais je pense que si l'utilisateur l'a fait basculer, vous obtiendrez également un rappel onClick si vous définissez cet écouteur. Ainsi, vous pouvez peut-être définir un indicateur booléen dans le onClick et le vérifier dans le onCheckChanged pour voir si l'utilisateur a initié le changement.
1 votes
Connexe Changer la valeur de la case à cocher sans déclencher onCheckChanged proposé par krishan
0 votes
J'ai une solution plus simple et plus claire : voir stackoverflow.com/a/41574200/3256989