不触发OnCheckChanged监听器的情况下更改开关状态

15

有没有什么解决方法可以在编程中使用 switch.setChecked(true); 改变Switch小部件的状态,但不触发 OnCheckedChangedlistener() ?

switch.setChecked(true); 会自动触发OnCheckedChangedlistener(),但我需要它仅在用户手动更改状态时才触发。所以我需要停止
switch.setChecked(true); 触发OnCheckedChangedlistener()


你可以像你说的那样使用 switch.setChecked(true/false)。 - Geethakrishna Juluri
但它会自动触发OnCheckedChangedlistener(),而我需要它仅在用户手动更改状态时才触发。 - Safa
自动触发的意思是什么? - Geethakrishna Juluri
1
当我添加这行代码 switch.setChecked(true/false) 来根据API的响应更改状态并进行调试时,我发现这段代码被调用了。@Override public void onCheckedChanged(SwitchButton view, boolean isChecked) { if (isChecked) { requestPermissions(); } } - Safa
4个回答

16

不要使用 onClickListener 来处理切换事件,应该使用

 mySwitch.setOnCheckedChangeListener { compoundButton, isChecked ->
    if (compoundButton?.isPressed == true) 
        viewModel.onMySwitchChanged(isChecked)
}

检查 if (compoundButton?.isPressed == true) 防止在设置开关状态时像mySwitch.isChecked = truemySwitch.isSelected = true一样运行viewModel.onMySwitchChanged


1
不确定为什么这个没有得到更多的赞,这个代码可以工作并简化很多事情! - Bruce
这是正确的方法,应该是正确答案! - zidanex
同意!这个解决方案对我来说是最好的。 - enghong

15

我通过使用setOnClickListener()而不是setOnCheckedChangeListener()解决了这个问题,然后我可以在单击侦听器内使用isChecked来知道Switch是否被选中,例如:

switchView.setOnClickListener {
    val isChecked = switchView.isChecked

    // Do something with the check status
}

1
请注意,滑动开关(而不是点击)不会触发此监听器。 - fernandospr
这个解决方案对我也很有帮助。setOnCheckedChangeListener() - 即使您没有点击开关按钮,它也会自动工作。但是switchView.setOnClickListener{} - 它按照预期工作... - Miramax Mars
1
不支持滑动操作,因此它不是一个好的解决方案! - zidanex

6
您可以先移除该监听器,然后再重新设置。
switch.setOnCheckChangedListener(null);
switch.setChecked(true);
switch.setOnCheckChangedListener(mOnCheckChangedListener);

我尝试了这个解决方案,但在重新设置监听器后,它的行为就像用户点击开关并调用OnCheckChangedListener()函数。 - Safa
好的,你可以尝试一些变通方法,switch.post(() -> switch.setOnCheckChangedListener(mOnCheckChangedListener)) - egoldx
相同的行为,真的很奇怪 :( - Safa

2

2种方法:

  1. 每当您以编程方式进行更改时,请维护一个布尔变量并将其设置为true。在OnCheckedChangeListener()中,检查是否来自用户或程序。

  2. (不推荐) 在您以编程方式进行更改之前,将yourSwtich.setOnCheckedChangeListener(null)设置为null。然后在下一行再次设置侦听器


1- 当我在OnCheckedChangeListener()中设置布尔变量时,即使我在switch.setChecked(true/false)之前已经更改它,它也将始终为true,因为一旦调用了OnCheckedChangeListener(),它就会变为true。2- 我尝试了这个解决方案,但重新设置监听器后它的行为就像用户点击了开关并调用了OnCheckChangedListener() - Safa
1
对于第一个答案,你必须在OnCheckedChangeListener()的末尾始终将布尔变量设置为false。在进行程序化更改之前,您必须将其设置为true。 - Geethakrishna Juluri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接