Risposta 2:
una risposta molto semplice:
all'uso su OnClickListener invece di 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);
}
});
Ora è scegliere solo gli eventi click e non devono preoccuparsi di modifiche programmatiche .
Risposta 1:
Ho creato una classe wrapper (vedi Decorator Pattern) che gestisce questo problema in modo incapsulato:
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 può ancora essere dichiarato lo stesso in XML , ma utilizzare questo quando si inizializza la GUI nel codice:
BetterCheckBox myCheckBox;
// later...
myCheckBox = new BetterCheckBox(context,
(CheckBox) view.findViewById(R.id.my_check_box));
Se si desidera impostare ch prelevato dal codice senza attivare l'ascoltatore, chiamare myCheckBox.silentlySetChecked(someBoolean)
anziché setChecked
.
Non sono sicuro, ma penso che se l'utente lo ha attivato, si otterrebbe anche un callback di ClickClick se si imposta quel listener. Quindi forse puoi impostare un flag booleano in onClick in questo modo puoi verificarlo suCheckChanged per vedere se l'utente ha avviato la modifica. – FoamyGuy
correlati [Modifica valore casella di controllo senza attivazione suCheckChanged] (http://stackoverflow.com/q/15523157/1699210), proposto da [krishan] (http://stackoverflow.com/users/2100079/krishan) – bummi
Ho più soluzione semplice e chiara: vedi http://stackoverflow.com/a/41574200/3256989 – ultraon