OnCheckedChangedlistener
をトリガーせずにswitch.setChecked(true);
を使用してAndroid Switchウィジェットの状態をプログラムで変更する方法を探しています。
最初に考えたのは、それをOnClickListener
に交換することでしたが、これはクリックを登録するだけで、クリックするだけでなく、スイッチをスライドさせることもできるため、ユーザーがスイッチをオフからオンにスライドすると、ユーザーがクリックしていないため、スイッチは実際には何もしません...
誰かがこれに対する解決策やスマートな回避策を持っているなら、それは素晴らしいでしょう
スイッチでコードを実行する直前に、リスナーの登録を解除し、必要なことをすべて実行してから、再度リスナーを登録します。
nullにリスナーを設定してから、setCheck()関数を呼び出し、そしてenableその後、次のように:
switch.setOnCheckedChangeListener (null);
switch.setChecked(true);
switch.setOnCheckedChangeListener (this);
私は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);
カスタム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;
}
}
すべての CompoundButton (2つの状態ボタン-オン/オフ)には、trueであるpressed状態がありますユーザーがビューを押している場合のみ 。
実際のロジックを開始する前に、リスナーにチェックを追加するだけです。
if(compoundButton.isPressed()) {
// continue with your listener
}
そのようにして、チェックされた値をプログラムで変更しても、不要なコードはトリガーされません。
@ krisDrOid から。