对焦点的处理是Android 电视开发与手机开发最大的区别之一。在手机上,关于焦点我们几乎不需要做额外的处理;而在电视机上则需要做大量的处理,如:焦点的显示样式(颜色、大小等)、焦点的导航、显示动画等。
focusable与focusableInTouchMode
在xml中对view设置属性:
android:focusable="true"
android:focusableInTouchMode="true"
动态设置:
View.setFocusable(true);
View.setFocusableInTouchMode(true)
上述属性focusable设置为true时当前控件才能获得焦点;反之,不能获得焦点。focusableInTouchMode用于设置是否可以通过触摸获取焦点。在手机应用开发中一般不需要对上述属性进行设置,电视应用很有必要,因为电视通常是通过遥控器来控制焦点的(也可以是鼠标)。
requestFocus
动态设置:
View.requestFocus();
xml中:
<requestFocus />
为控件设置焦点,通常会优先获取焦点(可能某些控件会抢夺焦点,如EditText)。打开页面时,通常会使用它来决定谁优先获得焦点。
descendantFocusability
当焦点获取出现问题是你可以尝试设置descendantFocusability属性 ,有以下三中值:
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
建议简化布局层级,层级过多会导致焦点处理变得复杂,也很难实现特殊的焦点选中效果。