Android switchButton当代码setCheck时与onCheckedChanged冲突

有一种场景,在某一activity中有一个switchButton,进入该页面时通过保存的boolean值通过setCheck(boolean)控制switchButton开启还是关闭,而该switchButton也注册了OnCheckedChangeListener事件,并在里面做相应的操作


Android switchButton当代码setCheck时与onCheckedChanged冲突_第1张图片
1

这时候如果一进来通过setCheck(boolean)控制switchButton开启还是关闭时,会进入到onCheckedChanged(),而这不是我们想要的结果,我们想要的是通过手动点击/滑动switchButton,进入onCheckedChanged()方法,而setCheck(boolean)不进入,关于该问题,网上解决办法有三种:

第一种:

设置booleanignoreChange=true;若果是setCheck(boolean)方法,设置booleanignoreChange=true,不然设置booleanignoreChange=false;但实际调测过程中发现onCheckedChanged有时会被调用多次,导致不是每次操作都符合预期;之后找到另一种方案是onCheckedChanged中调用switch.isPressed方法,如果为true,则处理,否则当做程序处理。但当滑动打开关闭switch时不起作用。该方案应该在Radiogroup和checkbox控件有作用(未测试过)。

第二种

不注册OnCheckedChangeListener,改注册OnClickListener()

这个方法一开始可行,不行的地方是switchButton滑动的时候监听不到,pass

第三种

最终找到的解决方案是在代码调用setchecked之前unregister listener,调用完之后register listener,最后成功解决该问题。部分代码如下:

@Override

publicvoidonCheckedChanged(CompoundButton buttonView,booleanisChecked)

{

            Intent toCreateGesturePwd =newIntent(this,

             CreateGesturePasswrodActivity.class);

             startActivity(toCreateGesturePwd);

}

@OverrideprotectedvoidonResume()

            {super.onResume();

            //反注册

            mGesturePwdSwitch.setOnCheckedChangeListener(null);

           if(isShowGesturePwd)

           {

              mGesturePwdSwitch.setChecked(true);

             }

            else

            {

             mGesturePwdSwitch.setChecked(false);

             }

          //注册回调

            mGesturePwdSwitch.setOnCheckedChangeListener(this);

           }

```

@Override

publicvoidonCheckedChanged(CompoundButton buttonView,booleanisChecked)

{

Intent toCreateGesturePwd =newIntent(this,

CreateGesturePasswrodActivity.class);

startActivity(toCreateGesturePwd);

}

```

你可能感兴趣的:(Android switchButton当代码setCheck时与onCheckedChanged冲突)