如题
开发中遇到个场景,SwitchCompat的开关状态有两种设置来源
1.用户操作开关开闭
2.调用某接口时某个字段设置开关状态
同时要求 当用户操作时 调用接口上报开关状态。非用户操作时,不调用接口。
首先考虑的是对click事件进行监听,当用户点击时,调用接口。
但很明显会有一点问题就是用户打开开关用的是滑动方式而不是点击方式时,监听不到,也就不会调用接口。
那么只剩下去实现
CompoundButton.OnCheckedChangeListener
可以既感知到滑动的状态变更又感知到点击的状态变更,但同时也会响应通过代码直接去变更按钮的状态,那么事情的关键就在于如何去区分是用户操作的,还是代码层面操作的。
由此有了两种方案去区分
方案一
凡是用户点击操作,必响应touch事件。那么可以置一个变量isTouched; 同时setOnTouchListener(),在onTouch事件中将isTouched设为true。在onCheckChanged方法中根据该值做操作。并重新赋值为false。
方案二
上面的方案一是针对 用户操作这个角度来区分的,由此想到,能不能针对非用户角度呢。针对非用户角度就需要是非用户操作时,onCheckChanged不会被响应。那么就有了思路二
如果不需要onCheckChanged响应
private fun changeStatusWithNoResponse(isOpen: Boolean){
//这样做只改按钮状态而不会触发回调 也就不会请求网络
sw?.setOnCheckedChangeListener(null)
sw?.isChecked = isOpen
sw?.setOnCheckedChangeListener(this)
}
很简单 先将listener置为空 然后设置开关状态 再置回listener
如果需要在onCheckChanged响应 就直接
sw?.isChecked = isOpen
没了。