大多數Android設備都是觸摸屏的,但是實際上Android設備也支持鍵盤操作,允許通過鍵盤來完成導航,點擊,輸入等。
當用戶通過鍵盤(或者軌跡球)操作的時候,有必要聚焦當前接受輸入的UI元素,例如,高亮(聚焦)某個按鈕,讓用戶知道當前正在操作的UI元素是哪個。
但是,當用戶使用觸摸屏與設備交互的時候,始終聚焦當前UI元素就沒有必要了,而且很丑陋;用戶點擊哪個元素,哪個元素就是當前元素,無需高亮標識。並且,通過觸摸屏與設備交互的時候,點擊某個UI元素也不會導致該元素聚焦,此時的高亮效果是由Pressed狀態來完成的。也就是說,在Touch Mode模式之下,UI元素是不會進入聚焦狀態的,即使調用requestFocus也不會。
那個,Android是如何區分這兩種情況的呢?
答案就是Touch Mode。當用戶開始通過鍵盤與設備交互的時候,設備就退出Touch Mode模式;當用戶開始通過觸摸屏與設備交互的時候,設備就進入Touch Mode模式。可以通過調用View的isInTouchMode來判斷設備當前是否處於Touch Mode模式。
但是,也有例外情況。有些UI元素,即使是在Touch Mode的狀態之下,也需要獲得焦點,典型的就是Edittext。那么,這種情況該如何處理呢?
答案就是做特殊處理。Android規定,某些元素,即使是在Touch Mode模式下,也可以獲得焦點。調用View的setFocusableInTouchMode(true)可以使View在Touch Mode模式之下仍然可獲得焦點(像Edittext就是在內部設置了這個屬性),調用isFocusableInTouchMode可以判斷View是否可在Touch Mode模式下聚焦。