Android - 以编程方式更改交换机的状态,而不触发OnCheckChanged侦听器

Pau*_*der 39 java android oncheckedchanged onclicklistener android-switch


我正在寻找一种在switch.setChecked(true);不触发的情况下以编程方式更改Android Switch小部件状态的方法OnCheckedChangedlistener.

我的第一个想法是将它换成一个,OnClickListener但因为这只记录点击次数,你不仅可以点击而且还可以滑动一个Switch然后它不适合用途,就好像用户要将Switch从关闭滑到打开然后当用户没有点击时,Switch实际上什么都不做......

如果有人为此获得解决方案或智能解决方案,那将是非常棒的

Mah*_*him 37

在调用setCheck()函数之前将侦听器设置为null,并在此之后启用它,如下所示:

switch.setOnCheckedChangeListener (null);
switch.setChecked(true);
switch.setOnCheckedChangeListener (this);
Run Code Online (Sandbox Code Playgroud)

参考:更改复选框值而不触发onCheckChanged


smn*_*npl 29

好吧,就在使用交换机进行代码处理之前,您可以取消注册监听器,然后执行您需要的任何操作,并再次注册监听器.

  • 你是如何重新注册监听器的? (3认同)
  • 我认为有两种选择: 1. switch.setOnCheckedChangeListener(null); //不确定,如果这会导致问题... 2. 创建一个虚拟类,使用一个虚拟方法 onCheckedChanged 实现 OnCheckedChangeListender,它什么都不做。然后注册一个新的对象,然后再注册你的默认监听器 (2认同)
  • 只要'listener'是对您的侦听器对象的引用,是的.这本来是我的工作方法(虽然我有更好的解决方案). (2认同)

Che*_*yar 17

我有一个解决方案,它在我的工作正常.我在我的开关控件上添加了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;
         }
    });
Run Code Online (Sandbox Code Playgroud)

这样,只有当通过拖动,点击,触摸进行人为干预,才会调用setOnCheckedChangeListener.

当您尝试更改切换控件的检查状态时,也不要忘记添加有效的字符串标记(非空).喜欢 :

 mMySwitch.setTag("TAG");
 mMySwitch.setChecked(true);
Run Code Online (Sandbox Code Playgroud)


hyb*_*996 8

编写自定义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;
}

}
Run Code Online (Sandbox Code Playgroud)


ron*_*nat 8

每个CompoundButton(两个状态按钮的开/关)都具有按下状态,仅当用户按下视图时才为true 。

在开始实际逻辑之前,只需在您的侦听器中添加一个检查:

if(compoundButton.isPressed()) {
    // continue with your listener
}
Run Code Online (Sandbox Code Playgroud)

这样,以编程方式更改检查值不会触发不需要的代码。

@krisDrOid答案。

  • 这不能可靠地工作,因为与开关的滑动交互(而不是点击)的“isPressed”通常是错误的。 (2认同)