Android SwitchCompat 設(shè)置為僅響應(yīng)用戶操作

如題

開發(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

沒了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容