当前位置: 代码迷 >> Android >> android 格局文件中 view 焦点获取浅析
  详细解决方案

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

热度:4   发布时间:2016-05-01 18:59:59.0
android 布局文件中 view 焦点获取浅析

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

?

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

?

?

1 楼 shanlingyunjavafuns 2012-03-30  
哥们分析的很透彻,只不过,有没有具体的解决方案!
  相关解决方案