前不久遇到一个问题,在一个布局文件中上下移动焦点,这个布局文件的大体结构如下:
<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布局文件的属性值解析说明: 1 android:id [为控件指定相应的ID] 2 android:text [指定控件当中显示的文字 需要注意的是 这里尽量使用strings xml文件当中的字符串] 3 android:gravity [指定View组件的对齐...
android 自定义view流式布局,
Android_如何置底一个View(附_前置声明layout布局文件中的资源ID)
一个旨在减少99%的drawable.xml文件的库,可直接在布局文件中对任意View声明drawable属性。
Android中自定义View之流式布局的Demo,代码中关键步骤并有注释原理解说,轻松掌握自定义View的onMeasure和onLayout的实现
实现了获取界面部分view,生成bitmap图片,也就是view截图,获取指定view的截图,适用于分享截图等
地址:http://blog.csdn.net/lloha/article/details/51496172
并且在介绍Button时采用的是直接new一个new OnClickListener对象的方式,而介绍ImageButton的时候采用的是该Activity实现OnClickListener接口的方式,在SDK中其实还有一种更简便的方式,在布局文件中给View加上点击...
Android TV listview及焦点处理 Android TV上的listview ,因为没有touch事件,只能...2.view中需要获取焦点需要高亮框效果,可以在view画外框: package com.cn21.ecloud.tv.ui.widget; import android.content.Con
1、在自己布局文件中,最外层容器添加引用 xmlns:badboy="http://schemas.android.com/apk/res-auto" badboy自己随意写 2、使用自定义布局 //线型布局 android:layout_width="match_parent" android:layout_...
Compose 和 Android 传统View 互相调用 示例 Demo Sample,以及在双层嵌套(原生View嵌套Compose,Compose中又嵌套原生View)的情况下,在最外层原生View中,怎么获取到Compose内部的原生View。 具体详见我的博客 : ...
Nodrawable是一个旨在减少99%的drawable.xml文件的库,可直接在布局文件中对任意View声明drawable属性。 方案原理:一种巧妙的drawable.xml替代方案 演示Demo:一种巧妙的drawable.xml替代方案-效果篇 特性 ① 成本...
在我们从Android小学生 进阶到 Android中学生的路上,肯定需要经历 自定义View。 大神已经给出了,最精简的Demo,我这里 顺水推舟,把一些基础知识 标记在代码之中,各位可以一边看源码 一边学基础。 觉得文章有用,...
AndroidTV中自定义RecyclerView 让当前焦点item显示在中间,调用smoothToCenter(pos)就可以。
Android中自定义View操作Android中自定义View操作Android中自定义View操作
android中动态更改View背景,换皮肤
android-pdfview是一个Android类库,提供一个快速读取显示Android PDF文件的组件——PDFView,该组件支持手势、动画和缩放。并且基于Google的VuDroid类库解码PDF文件。可以通过手势滑动PDF文件、对PDF文件进行放大...
有时应用程序中会有一些很少用到的复杂布局。在需要它们的时候再加载可以降低内存的消耗,同时也可以加快界面的渲染速度。 定义ViewStub ViewStub是一个轻量级的View,它没有高宽,也不会绘制任何东西。所以它的加载...
NULL 博文链接:https://geyubin.iteye.com/blog/1562868
Android中View绘制流程