web-dev-qa-db-ja.com

Android-OnCheckChangedリスナーをトリガーせずにプログラムでスイッチの状態を変更する


OnCheckedChangedlistenerをトリガーせずにswitch.setChecked(true);を使用してAndroid Switchウィジェットの状態をプログラムで変更する方法を探しています。

最初に考えたのは、それをOnClickListenerに交換することでしたが、これはクリックを登録するだけで、クリックするだけでなく、スイッチをスライドさせることもできるため、ユーザーがスイッチをオフからオンにスライドすると、ユーザーがクリックしていないため、スイッチは実際には何もしません...

誰かがこれに対する解決策やスマートな回避策を持っているなら、それは素晴らしいでしょう

36
Paul Alexander

スイッチでコードを実行する直前に、リスナーの登録を解除し、必要なことをすべて実行してから、再度リスナーを登録します。

29
smnpl

nullにリスナーを設定してから、setCheck()関数を呼び出し、そしてenableその後、次のように:

switch.setOnCheckedChangeListener (null);
switch.setChecked(true);
switch.setOnCheckedChangeListener (this);

参照onCheckChangedをトリガーせずにチェックボックスの値を変更する

34
Mahmoud Ibrahim

私は1つの解決策を持っています。スイッチコントロールにsetOnTouchListenerとsetOnCheckedChangeListenerを追加し、問題を解決するために次のコードを追加しました。

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

このように、setOnCheckedChangeListenerは、ドラッグ、クリック、タッチによる人間の介入によってチェックの変更が発生した場合にのみ呼び出されます。

また、スイッチコントロールのチェックステータスを変更するときに、有効な文字列タグ(null以外)を追加することを忘れないでください。のような:

 mMySwitch.setTag("TAG");
 mMySwitch.setChecked(true);
16
Chetan Bhoyar

カスタムSwitchまたはSwitchCompatを作成し、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;
}

}
8
hyb1996

すべての CompoundButton (2つの状態ボタン-オン/オフ)には、trueであるpressed状態がありますユーザーがビューを押している場合のみ

実際のロジックを開始する前に、リスナーにチェックを追加するだけです。

if(compoundButton.isPressed()) {
    // continue with your listener
}

そのようにして、チェックされた値をプログラムで変更しても、不要なコードはトリガーされません。

@ krisDrOid から。

6
ronginat