参与开发一个视频播放器的时候,发现对布局中的焦点的控制不会。。有的能下来有的不能下来,有的下来之后又上不去了,究竟是什么原因呢。

看了这篇文章,顿时解惑不少。

dispatchKeyEvent ;

dispatchKeyEvent  重新获取按键消息,从而在全局上使得布局中 你想要获取焦点的元素获取焦点。而在焦点中的元素是干不了不属于自己

范围内的事情。

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

<RelativeLayout > 
                    <LinearLayout ></LinearLayout> 
                    <HorizontalScrollView > 
                               <LinearLayout ></LinearLayout> 
                     </HorizontalScrollView>
            </RelativeLayout>

 HorizontalScrollView 布局中左右移动焦点,在 下面的 LinearLayout 中有很多水 平放置的AppWidget,当焦点移动到某个AppWidget时将这个AppWidget的Layout布局放到上面

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

 HorizontalScrollView 来处理,处理方法是在: 

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

LinearLayout 上,或者移动上去后就移不下来了。 

           下面谈谈我的解决过程: 

HorizontalScrollView 的定义是: Layout container for a view 

HorizontalScrollView 只能添加 KeyEvent.KEYCODE_DPAD_RIGHT 和 KeyEvent.KEYCODE_DPAD_LEFT 的 KeyEvent 事件,而  KeyEvent.KEYCODE_DPAD_DOWN 和 KeyEvent.KEYCODE_DPAD_UP 事件是得不到正确处理的。

 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 中自由的移动焦点。