参与开发一个视频播放器的时候,发现对布局中的焦点的控制不会。。有的能下来有的不能下来,有的下来之后又上不去了,究竟是什么原因呢。
看了这篇文章,顿时解惑不少。
关键词在于:边界,Activity对整体焦点的控制,dispatchKeyEvent ;
就是利用dispatchKeyEvent 重新获取按键消息,从而在全局上使得布局中 你想要获取焦点的元素获取焦点。而在焦点中的元素是干不了不属于自己
范围内的事情。
原文:单击打开原文
前不久遇到一个问题,在一个布局文件中上下移动焦点,这个布局文件的大体结构如下:
<RelativeLayout >
<LinearLayout ></LinearLayout>
<HorizontalScrollView >
<LinearLayout ></LinearLayout>
</HorizontalScrollView>
</RelativeLayout>
现在遇到的问题是:我们要在 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 中自由的移动焦点。