SORU
3 ŞUBAT 2012, Cuma


Nasıl olsun Anahtarı ayırt edebilirim,Değeri kullanıcı veya program aracılığıyla değiştirildi (tutma dahil) Checkbox?

setOnCheckedChangeListener(new OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // How to check whether the checkbox/switch has been checked
                // by user or it has been checked programatically ?

                if (isNotSetByUser())
                    return;
                handleSetbyUser();
            }
        });

Nasıl yöntem isNotSetByUser() uygulamak için?

CEVAP
13 Ocak 2013, Pazar


Cevap 2:

Cevabı çok basit:

OnCheckedChangeListener yerine OnClickListener üzerinde kullanın

    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);
        }

    });

Şimdi click olayları almak ve programlı değişiklikler hakkında endişelenmenize gerek yok.


Cevap 1:

Şifrelenmiş bir şekilde bu sorunu işleyen bir sarıcı sınıf (Dekoratör Desen) oluşturduk:

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(this.myListener == 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 hala XML aynı bildirilebilir, ama kod senin GUI başlatırken bunu kullanın:

BetterCheckBox myCheckBox;

// later...
myCheckBox = new BetterCheckBox(context,
    (CheckBox) view.findViewById(R.id.my_check_box));

Eğer dinleyici tetiklemeden kodu kontrol edip ayarlamak istiyorsanız, setChecked yerine myCheckBox.silentlySetChecked(someBoolean) Ara.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • majesticdubstep

    majesticdubs

    3 Kasım 2011
  • Matt Stokes

    Matt Stokes

    22 Ocak 2008
  • Crossover

    Crossover

    18 HAZİRAN 2007