微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > 全键盘时焦点切换问题

全键盘时焦点切换问题

时间: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

<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)查找。
  

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top