1. 啥是 TouchMode
現在的智能設備,包括智能手機、平板電腦、智能電視等,可以有多種交互/輸入方式,常見的方式有觸屏、藍牙外接鍵盤、外接手柄、遙控器等。其中觸屏方式就是 TouchMode。
2. 爲啥要有 TouchMode
說道交互,就繞不開一個東東:焦點。焦點是一種狀態,標誌當前正在接收用戶輸入動作。常見的有輸入框控件中的光標閃動、按鈕高等。特別是在智能電視上,需要通過焦點來實時告訴用戶即將接收點擊事件的目標控件。而觸屏方式下,比如按鈕,是不需要焦點的。即,同一個控件,在不同的交互方式下,需要展示不同的狀態。顯然,爲了實現這一點,安卓系統需要感知到當前的交互方式是觸屏還是鍵盤等。於是就產生了 TouchMode,用於表徵當前系統的輸入方式爲觸屏模式。
注意,外接鍵盤和屏幕上的軟鍵盤是兩種不同的交互方式,前者不是 TouchMode,而後者屬於 TouchMode。
3. 何時使用 TouchMode
TouchMode 是由系統控制的。當用戶使用觸屏時,比如滑動、點擊等操作,系統就進入 TouchMode;當用戶使用外接鍵盤時,比如點擊方向鍵時,系統就離開 TouchMode。
4. 如何使用 TouchMode
- TouchMode 是跨 Activity 的,即 TouchMode 是系統屬性,不存在某個 Activity 處於 TouchMode 而其他 Activity 處於非 TouchMode 的情況,可以通過
View#isInTouchMode()
方法判斷當前系統是否處於 TouchMode; - 當控件擁有 focus 的時候,click 事件纔會被執行;
- 設備進入 TouchMode 後,控件之前的 selection 和 focus 狀態會被清除,比如,Item 全是 TextView 的 RecyclerView,當在非 TouchMode 下點擊方向鍵時,會從屏幕上第一項開始選中 item,當進入 TouchMode 後這些選中狀態都會被清除;
View#setFocusable(false)
會導致View#setFocusableInTouchMode(false)
;View#setFocusableInTouchMode(true)
會導致View#setFocusable(true)
;