全键盘时焦点切换问题
时间:10-02
整理:3721RD
点击:
[DESCRIPTION]
有一些项目会使用全键盘,通过方向键切换焦点,对手机进行操作。但android内置的应用大部分未考虑到全键盘的情景,需要修改App及php?mod=tag&id=6090" target="_blank" class="relatedlink">Framework层来适配全键盘。
[SOLUTION]
目前遇到的问题大致有以下几类,可以参考修改
1.ActionBar中的view无法获取焦点
将下列文件中的所有 touchscreenBlocksFocus属性改为false
/frameworks/base/core/res/res/Layout/screen_action_bar.xml
/frameworks/base/core/res/res/layout/screen_toolbar.xml
2.某个view无法获取焦点
(1)设置view的focusable属性为true,可调用view.setFocusable(true);
(2)看看焦点是否是被父view拿到,如果是被父view拿到,可以设置父view的focusable属性为false;或者设置父view的 descendantFocusability属性值为FOCUS_AFTER_DESCENDANTS 调用parentView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);调用此方法后会先让child view获取焦点。
3.焦点切换错误
(1)可以在 xml文件中配置当前view的下一个focus是哪个view
(2)如果没有在xml中配置,则framework会根据view tree中view的位置关系来找下一个焦点
对于简单的view一般焦点的切换没有问题;对于复杂的view由于内部有一些处理导致焦点获得后又丢失,framework重新找了一个默认的焦点。 这种情况下需要在APP端找一些workaround的方法解决这些问题。
4.方向键客制化问题
重载View 的onKeyDown 函数,对方向键的keycode做客制化即可, demo code如下
5.如何查看是哪个view获取了焦点
使用google提供的hierarchyviewer来查看焦点
选中view后,展开focus属性:
hasFocus:为true表示此view在焦点路径上,及该view的某个子view获得焦点;为false表示该view不在焦点路径上
isFocusable:表示该view能否获得focus
isFocused:表示当前view是否获得了focus,为true说明当前的view为focus view。
一般来说某个view获得focus,这三个属性都为true。查找focus view 可以从decorview沿着焦点路径(hasFocus=true)查找。

有一些项目会使用全键盘,通过方向键切换焦点,对手机进行操作。但android内置的应用大部分未考虑到全键盘的情景,需要修改App及php?mod=tag&id=6090" target="_blank" class="relatedlink">Framework层来适配全键盘。
[SOLUTION]
目前遇到的问题大致有以下几类,可以参考修改
1.ActionBar中的view无法获取焦点
将下列文件中的所有 touchscreenBlocksFocus属性改为false
/frameworks/base/core/res/res/Layout/screen_action_bar.xml
/frameworks/base/core/res/res/layout/screen_toolbar.xml
2.某个view无法获取焦点
(1)设置view的focusable属性为true,可调用view.setFocusable(true);
(2)看看焦点是否是被父view拿到,如果是被父view拿到,可以设置父view的focusable属性为false;或者设置父view的 descendantFocusability属性值为FOCUS_AFTER_DESCENDANTS 调用parentView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);调用此方法后会先让child view获取焦点。
3.焦点切换错误
(1)可以在 xml文件中配置当前view的下一个focus是哪个view
<Button android:id="@+id/top"
android:nextFocusUp="@+id/bottom"
... />
一共包括4个属性nextFocusUp、nextFocusDown、nextFocusRight、nextFocusLeft,分别表示按方向上键、方向下键、方向右键、方向左键时下一个获得焦点的view。
(2)如果没有在xml中配置,则framework会根据view tree中view的位置关系来找下一个焦点
对于简单的view一般焦点的切换没有问题;对于复杂的view由于内部有一些处理导致焦点获得后又丢失,framework重新找了一个默认的焦点。 这种情况下需要在APP端找一些workaround的方法解决这些问题。
4.方向键客制化问题
重载View 的onKeyDown 函数,对方向键的keycode做客制化即可, demo code如下
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_DPAD_RIGHT
|| keyCode == KeyEvent.KEYCODE_DPAD_LEFT || keyCode == KeyEvent.KEYCODE_DPAD_UP
|| keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
.....//do the things you want
}
5.如何查看是哪个view获取了焦点
使用google提供的hierarchyviewer来查看焦点
选中view后,展开focus属性:
hasFocus:为true表示此view在焦点路径上,及该view的某个子view获得焦点;为false表示该view不在焦点路径上
isFocusable:表示该view能否获得focus
isFocused:表示当前view是否获得了focus,为true说明当前的view为focus view。
一般来说某个view获得focus,这三个属性都为true。查找focus view 可以从decorview沿着焦点路径(hasFocus=true)查找。

