android 布局文件中 view 焦点获取浅析
2014-11-07 12:29
281 查看
参与开发一个视频播放器的时候,发现对布局中的焦点的控制不会。。有的能下来有的不能下来,有的下来之后又上不去了,究竟是什么原因呢。
看了这篇文章,顿时解惑不少。
关键词在于:边界,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 中自由的移动焦点。
看了这篇文章,顿时解惑不少。
关键词在于:边界,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 中自由的移动焦点。
相关文章推荐
- android 布局文件中 view 焦点获取浅析
- android布局文件解析成view树浅析
- AndroidTextView的跑马灯效果,解决复杂布局不能获取焦点的问题
- Android中将布局文件/View添加至窗口过程分析 ---- 从setContentView()谈起
- android setContentView() 找不到 R下的布局文件的解决办法。
- (转)Android中View绘制优化二一---- 使用<include />标签复用布局文件
- android view获取焦点且有黄色高亮效果
- android中布局文件中的控件通过findviewbyid无法关联的解决方法
- Android中将布局文件/View添加至窗口过程分析 ---- 从setContentView()谈起 .
- Android中关于布局文件延迟加载控件ViewStub
- Android中measure过程、WRAP_CONTENT详解以及 xml布局文件解析流程浅析
- Android中将布局文件/View添加至窗口过程分析 ---- 从setContentView()谈起
- Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)
- Android View如何获取焦点
- android在布局文件中自定义参数并在初始化时获取
- 【Android 如何置底一个View(附 前置声明layout布局文件中的资源ID)】
- Android中将布局文件/View添加至窗口过程分析 ---- 从setContentView()谈起
- Android WebView 文本框获取焦点后自动放大的解决方案
- Android中View绘制优化二一---- 使用<include />标签复用布局文件
- android中布局文件中的控件通过findviewbyid无法关联的解决方法