android 布局文件中 view 焦点获取浅析

阅读更多

              前不久遇到一个问题,在一个布局文件中上下移动焦点,这个布局文件的大体结构如下:

 

           

                    >

                   

                               >

                    

           

 

        现在遇到的问题是:我们要在 HorizontalScrollView 布局中左右移动焦点,在 下面的 LinearLayout 中有很多水

 

平放置的AppWidget,当焦点移动到某个AppWidget时将这个AppWidget的Layout布局放到上面

 

的 LinearLayout 中,我们需要实现的效果是:可以将焦点在上下两个 LinearLayout 之间移动。

 

          在最初的设计中,我们是将 KeyEvent 事件交给 HorizontalScrollView 来处理,处理方法是在: 

 

HorizontalScrollView 上加了 OnKeyListener。结果是:我们只能在下面的 LinearLayout 中左右移动焦点,不能

 

将焦点移动到上面的 LinearLayout 上,或者移动上去后就移不下来了。

 

           下面谈谈我的解决过程:

 

         (1)首先在 android SDK 文档中对 HorizontalScrollView 的定义是: Layout container for a view

 

hierarchy,并且 HorizontalScrollView only supports horizontal scrolling.  所以,在 HorizontalScrollView

 

能添加 KeyEvent.KEYCODE_DPAD_RIGHT 和 KeyEvent.KEYCODE_DPAD_LEFT 的 KeyEvent 事件,而 

 

KeyEvent.KEYCODE_DPAD_DOWN 和 KeyEvent.KEYCODE_DPAD_UP 事件是得不到正确处理的。

 

原因有两点:(1)HorizontalScrollView 本身只能在水平方向移动。(2)OnKeyListener 事件是加

 

在 HorizontalScrollView 上的,如果你想向上移动到上面的 LinearLayout 上,其实已经越界了,不是这

 

个 OnKeyListener 能处理的了。

 

           (2)在 android 中当一个按键按下时的处理过程是: 

 

             首先触发该 Activity 的 dispatchKeyEvent 方法

 

             然后触发 onUserInteraction 方法

 

             再然后触发 onKeyDown 方法

 

           (3)android 对 dispatchKeyEvent 方法的定义是: Called to process key events. You can override

 

this to intercept all key events before they are dispatched to the window. 所以,要想在整个 Layout 中移

 

动焦点,应该重写 dispatchKeyEvent 方法,将 KeyEvent 事件首先交给 dispatchKeyEvent 方法来处理,才能在这

 

个 Activity 的整个 Layout 中自由的移动焦点。

 

 

你可能感兴趣的:(焦点,获取,移动)