????????????? 前不久遇到一个问题,在一个布局文件中上下移动焦点,这个布局文件的大体结构如下:
?
??????????? <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 中自由的移动焦点。
?
?