`
liuyun025
  • 浏览: 123894 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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  
哥们分析的很透彻,只不过,有没有具体的解决方案!

相关推荐

    Android布局文件大全

    Android布局文件的属性值解析说明: 1 android:id [为控件指定相应的ID] 2 android:text [指定控件当中显示的文字 需要注意的是 这里尽量使用strings xml文件当中的字符串] 3 android:gravity [指定View组件的对齐...

    android获取根View的方法

    以下将详细阐述Android中获取根View的方法以及其应用场景。 一、通过findViewById()方法获取 这是最常见的方式,通常在Activity的onCreate()方法中执行。首先需要确保已经调用了setContentView()方法来设置布局...

    获取当前布局文件中控件的数据并封返回Map,序列化布局文件控件的值,获取所有控件的值

    在Android中,布局文件是XML文件,用于定义用户界面的结构和控件。例如,我们可能有一个包含TextView、EditText、Button等控件的布局文件。每个控件都有自己的属性,如文本内容、ID、可见性等。 要获取布局文件中...

    android获取焦点后按钮变大

    首先,我们需要了解Android中的焦点机制。在Android中,每个可点击的UI元素(如Button)都有一个焦点状态,这个状态可以在用户与界面交互时改变。默认情况下,当一个元素获得焦点时,系统会应用一些视觉变化,如改变...

    Android自定义VIew实现卫星菜单效果浅析

    本篇文章将探讨如何在Android中实现一个卫星菜单效果,该效果通常表现为一个中心按钮,点击后会有多个子菜单项按照特定轨迹展开,类似于卫星围绕地球运行。 首先,创建自定义View通常涉及以下步骤: 1. **创建View...

    android的布局文件介绍

    在Android开发中,布局文件是构建用户界面的关键组成部分。它们定义了应用屏幕上的各个组件(View)如何排列和展示。本篇文章将详细讲解Android的几种布局方式,包括线性布局、相对布局、表格布局、网格视图、标签...

    android 布局生成图片

    本文将深入探讨如何在Android中实现“布局生成图片”这一技术,以及如何将其与微信分享功能集成。 首先,让我们了解“布局生成图片”的基本原理。在Android中,我们可以利用`ViewGroup`的`drawToBitmap()`方法来...

    Android_如何置底一个View(附_前置声明layout布局文件中的资源ID)

    这就是如何在Android中实现View置底的一个实际应用。 此外,关于在XML布局文件中声明和引用资源ID,Android使用`@+id/`语法来创建新的ID,`@id/`则是引用已存在的ID。例如,`android:id="@+id/lv_test"`表示创建一...

    android在布局文件中自定义参数并在初始化时获取

    在Android开发中,布局文件是构建用户界面的关键部分。它们定义了UI元素的结构和样式,通常使用XML编写。为了使应用更具灵活性和可扩展性,开发者有时需要在布局文件中自定义参数,并在程序运行时初始化时获取这些...

    Android7.0 自定义文件管理器 获取文件夹路径

    使用XML布局文件来设计这些视图,并在Java或Kotlin代码中进行填充。 3. 文件和目录遍历: 使用`java.io.File`类可以遍历文件系统。`listFiles()`方法返回指定目录下的所有文件和子目录。递归调用此方法可以遍历...

    RecyclerView中item焦点问题

    在RecyclerView的父布局或者Activity中,我们可能需要重写`onTouchEvent`方法,确保焦点能正确传递到RecyclerView的item。这通常涉及到调用`requestFocusFromTouch()`方法来让当前被触摸的item获取焦点。 4. 设置...

    android中动态更改View背景

    首先,我们需要了解Android中的View。View是Android UI系统的基础组件,它代表了屏幕上的一个可视元素,如按钮、文本框等。每个View都有自己的背景,可以通过设置`android:background`属性来定义。背景可以是颜色、...

    pdfview打开pdf文件,避免android无法通过webview打开pdf文件

    接下来,我们需要在布局文件中添加PDFView控件。在XML布局文件中,添加以下代码: ```xml &lt;com.github.barteksc.pdfviewer.PDFView android:id="@+id/pdfView" android:layout_width="match_parent" android:...

    Android在布局中动态添加view的两种方法共5页.p

    LayoutInflater是Android中的一个关键类,主要用于将XML布局文件解析为视图对象。这种方法适用于当你已经有一个预先设计好的XML布局,想要在运行时将其添加到现有布局中。 步骤如下: a. 获取LayoutInflater实例:...

    android界面布局详解

    2、Android中布局定义方法 布局可以通过两种方式进行定义: - **XML文件**:这是最常见的方法,Android提供了丰富的XML词汇表,对应于各种视图和布局。XML文件中,每个元素代表一个View或ViewGroup,使得界面结构...

    android超出布局点击失效解决方案附带自定义控件

    首先,我们要理解Android中的事件传递机制。当用户点击屏幕时,事件会从最顶层的父布局开始向下传递,直到找到能接收该事件的View。如果某个View超出了其父布局的边界,由于父布局并未将其完全包含,因此点击事件...

    VerticalGridView第一行获取焦点后,再次按向上键,上方的控件获取不到焦点解决方案

    6. **利用OverScrollDecoratorHelper**:在某些版本的Android中,谷歌引入了OverScrollDecoratorHelper,可以帮助处理边界情况下的焦点问题。你可以尝试使用这个工具类看看是否能解决问题。 在代码实现过程中,为了...

    android中模拟焦点移动

    在Android中,每个可以接收输入的View(如Button、EditText)都有一个焦点状态,分为两种:获得焦点(focused)和无焦点(unfocused)。焦点的移动是由系统的焦点管理器自动处理的,但开发者可以通过编程方式控制这...

    Android七种布局解析

    在 XML 布局文件中,线性布局可以使用 LinearLayout 元素来定义。 三、相对布局(Relative Layout) 相对布局是一种 ViewGroup,以相对位置显示它的子视图(view)元素。相对布局可以通过设置 android:layout_...

    动态添加布局文件的demo

    - **布局文件(Layout File)**:在Android中,通常使用XML文件来定义UI元素和它们的布局,这些文件存储在项目的res/layout目录下。 - **视图(View)与视图组(ViewGroup)**:视图是Android UI的基本元素,如...

Global site tag (gtag.js) - Google Analytics