focusableInTouchMode
对于一个拥有触摸屏功能的设备而言, 一旦用户用手点击屏幕, 设备会立刻进入touch mode。这时候被点击的控件只有isFocusableInTouchMode()为true的时候才会获得focus,比如EditText控件。
其他可以触摸的控件比如Button(其isFocusableInTouchMode默认为false), 当被点击的时候不会获取焦点,它们只是简单地执行onClick事件而已。
Android touch mode和focusableInTouchMode分析
focusableInTouchMode是指在touch mode(可以通过调用view.isInTouchMode()查看,一般手机都是true,TV是false)下点击也能获取到焦点。
问题:
我是想TV的应用在平板上也可以操作,所以设置了focusableInTouchMode这个属性,但是设置后发现没有效果,点击并不会让View获取到焦点。
设置了
android:focusable="true"
android:focusableInTouchMode="true"
在点击时也还是不会移动焦点。
解决方案
首先保证view.isInTouchMode()是true.
其次断点系统源码查看事件分发流程,发现是因为在分发事件中:
if (clickable || (viewFlags & TOOLTIP) == TOOLTIP) {
switch (action) {
case MotionEvent.ACTION_UP:
...
if (isFocusable() && isFocusableInTouchMode() && !isFocused()) {
focusTaken = requestFocus();
}
return true;
}
return false;
如果不可点击,直接就不会消费事件更别说获取焦点(获取焦点在ACTION_UP中)了。
所以原因就是没有设置可点击(因为应用主要是在TV上,所以事件基本都是在FocusChange上面,并没有设置点击事件)。
加上android:clickable=“true”,或者给view设置一个点击事件就行了