如題
開發(fā)中遇到個場景,SwitchCompat的開關(guān)狀態(tài)有兩種設(shè)置來源
1.用戶操作開關(guān)開閉
2.調(diào)用某接口時某個字段設(shè)置開關(guān)狀態(tài)
同時要求 當用戶操作時 調(diào)用接口上報開關(guān)狀態(tài)。非用戶操作時,不調(diào)用接口。
首先考慮的是對click事件進行監(jiān)聽,當用戶點擊時,調(diào)用接口。
但很明顯會有一點問題就是用戶打開開關(guān)用的是滑動方式而不是點擊方式時,監(jiān)聽不到,也就不會調(diào)用接口。
那么只剩下去實現(xiàn)
CompoundButton.OnCheckedChangeListener
可以既感知到滑動的狀態(tài)變更又感知到點擊的狀態(tài)變更,但同時也會響應(yīng)通過代碼直接去變更按鈕的狀態(tài),那么事情的關(guān)鍵就在于如何去區(qū)分是用戶操作的,還是代碼層面操作的。
由此有了兩種方案去區(qū)分
方案一
凡是用戶點擊操作,必響應(yīng)touch事件。那么可以置一個變量isTouched; 同時setOnTouchListener(),在onTouch事件中將isTouched設(shè)為true。在onCheckChanged方法中根據(jù)該值做操作。并重新賦值為false。

image.png
方案二
上面的方案一是針對 用戶操作這個角度來區(qū)分的,由此想到,能不能針對非用戶角度呢。針對非用戶角度就需要是非用戶操作時,onCheckChanged不會被響應(yīng)。那么就有了思路二
如果不需要onCheckChanged響應(yīng)
private fun changeStatusWithNoResponse(isOpen: Boolean){
//這樣做只改按鈕狀態(tài)而不會觸發(fā)回調(diào) 也就不會請求網(wǎng)絡(luò)
sw?.setOnCheckedChangeListener(null)
sw?.isChecked = isOpen
sw?.setOnCheckedChangeListener(this)
}
很簡單 先將listener置為空 然后設(shè)置開關(guān)狀態(tài) 再置回listener
如果需要在onCheckChanged響應(yīng) 就直接
sw?.isChecked = isOpen
沒了。