`

Android事件1-开发指南-用户界面-事件处理

阅读更多
android事件处理总结包括android1-4篇


viewGroup的dispatchTouchEvent方法会在其onInterceptTouchEvent方法之前被触发.

首先触发ACTIVITY的dispatchTouchEvent

然后触发ACTIVITY的onUserInteraction

然后触发LAYOUT的dispatchTouchEvent

然后触发LAYOUT的onInterceptTouchEvent

 

Android1-开发指南-用户界面-事件处理  

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/iefreer/archive/2009/09/23/4586351.aspx


处理用户界面事件Handling UI Events
在Android上,不止一个途径来侦听用户和应用程序之间交互的事件。对于用户界面里的事件,侦听方法就是从与用户交互的特定视图对象截获这些事件。视图类提供了相应的手段。

在各种用来组建布局的视图类里面,你可能会注意到一些公共的回调方法看起来对用户界面事件有用。这些方法在该对象的相关动作发生时被Android框架调用。比如,当一个视图(如一个按钮)被触摸时,该对象上的onTouchEvent()方法会被调用。不过,为了侦听这个事件,你必须扩展这个类并重写该方法。很明显,扩展每个你想使用的视图对象(只是处理一个事件)是荒唐的。这就是为什么视图类也包含了一个嵌套接口的集合,这些接口含有实现起来简单得多的回调函数。这些接口叫做事件侦听器event listeners,是用来截获用户和你的界面交互动作的“门票”。

当你更为普遍的使用事件侦听器来侦听用户动作时,总有那么一次你可能得为了创建一个自定义组件而扩展一个视图类。也许你想扩展按钮Button类来使某些事更花哨。在这种情况下,你将能够使事件处理器event handlers类来为你的类定义缺省事件行为。

 

事件侦听器Event Listeners
事件侦听器是视图View类的接口,包含一个单独的回调方法。这些方法将在视图中注册的侦听器被用户界面操作触发时由Android框架调用。下面这些回调方法被包含在事件侦听器接口中:

onClick()

包含于View.OnClickListener。当用户触摸这个item(在触摸模式下),或者通过浏览键或跟踪球聚焦在这个item上,然后按下“确认”键或者按下跟踪球时被调用。

onLongClick()

包含于View.OnLongClickListener。当用户触摸并控制住这个item(在触摸模式下),或者通过浏览键或跟踪球聚焦在这个item上,然后保持按下“确认”键或者按下跟踪球(一秒钟)时被调用。

onFocusChange()

包含于View.OnFocusChangeListener。当用户使用浏览键或跟踪球浏览进入或离开这个item时被调用。

onKey()

包含于View.OnKeyListener。当用户聚焦在这个item上并按下或释放设备上的一个按键时被调用。

onTouch()

包含于View.OnTouchListener。当用户执行的动作被当做一个触摸事件时被调用,包括按下,释放,或者屏幕上任何的移动手势(在这个item的边界内)。

onCreateContextMenu()

包含于View.OnCreateContextMenuListener。当正在创建一个上下文菜单的时候被调用(作为持续的“长点击”动作的结果)。参阅创建菜单Creating Menus章节以获取更多信息。

这些方法是它们相应接口的唯一“住户”。要定义这些方法并处理你的事件,在你的活动中实现这个嵌套接口或定义它为一个匿名类。然后,传递你的实现的一个实例给各自的View.set...Listener() 方法。(比如,调用setOnClickListener()并传递给它你的OnClickListener实现。)

下面的例子说明了如何为一个按钮注册一个点击侦听器:

// Create an anonymous implementation of OnClickListener

private OnClickListener mCorkyListener = new OnClickListener() {

    public void onClick(View v) {

      // do something when the button is clicked

    }

};

 

protected void onCreate(Bundle savedValues) {

    ...

    // Capture our button from layout

    Button button = (Button)findViewById(R.id.corky);

    // Register the onClick listener with the implementation above

    button.setOnClickListener(mCorkyListener);

    ...

}

你可能会发现把OnClickListener作为活动的一部分来实现会便利的多。这将避免额外的类加载和对象分配。比如:

public class ExampleActivity extends Activity implements OnClickListener {

    protected void onCreate(Bundle savedValues) {

        ...

        Button button = (Button)findViewById(R.id.corky);

        button.setOnClickListener(this);

    }

 

    // Implement the OnClickListener callback

    public void onClick(View v) {

      // do something when the button is clicked

    }

    ...

}

注意上面例子中的onClick()回调没有返回值,但是一些其它事件侦听器必须返回一个布尔值。原因和事件相关。对于其中一些,原因如下:

·         onLongClick() – 返回一个布尔值来指示你是否已经消费了这个事件而不应该再进一步处理它。也就是说,返回true 表示你已经处理了这个事件而且到此为止;返回false 表示你还没有处理它和/或这个事件应该继续交给其他on-click侦听器。

·         onKey() –返回一个布尔值来指示你是否已经消费了这个事件而不应该再进一步处理它。也就是说,返回true 表示你已经处理了这个事件而且到此为止;返回false 表示你还没有处理它和/或这个事件应该继续交给其他on-key侦听器。

·         onTouch() - 返回一个布尔值来指示你的侦听器是否已经消费了这个事件。重要的是这个事件可以有多个彼此跟随的动作。因此,如果当接收到向下动作事件时你返回false,那表明你还没有消费这个事件而且对后续动作也不感兴趣。那么,你将不会被该事件中的其他动作调用,比如手势或最后出现向上动作事件。

记住按键事件总是递交给当前焦点所在的视图。它们从视图层次的顶层开始被分发,然后依次向下,直到到达恰当的目标。如果你的视图(或者一个子视图)当前拥有焦点,那么你可以看到事件经由dispatchKeyEvent()方法分发。除了从你的视图截获按键事件,还有一个可选方案,你还可以在你的活动中使用onKeyDown() and onKeyUp()来接收所有的事件。

注意: Android 将首先调用事件处理器,其次是类定义中合适的缺省处理器。这样,从这些事情侦听器中返回true 将停止事件向其它事件侦听器传播并且也会阻塞视图中的缺事件处理器的回调函数。因此当你返回true时确认你希望终止这个事件。

事件处理器Event Handlers
如果你从视图创建一个自定义组件,那么你将能够定义一些回调方法被用作缺省的事件处理器。在创建自定义组件Building Custom Components的文档中,你将学习到一些用作事件处理的通用回调函数,包括:

·         onKeyDown(int, KeyEvent) - 当一个新的按键事件发生时被调用。

·         onKeyUp(int, KeyEvent) - 当一个向上键事件发生时被调用。

·         onTrackballEvent(MotionEvent) - 当一个跟踪球运动事件发生时被调用。

·         onTouchEvent(MotionEvent) - 当一个触摸屏移动事件发生时调用。

·         onFocusChanged(boolean, int, Rect) - 当视图获得或者丢失焦点时被调用。

你应该知道还有一些其它方法,并不属于视图类的一部分,但可以直接影响你处理事件的方式。所以,当在一个布局里管理更复杂的事件时,考虑一下这些方法:

·         Activity.dispatchTouchEvent(MotionEvent) - 这允许你的活动可以在分发给窗口之前捕获所有的触摸事件。

·         ViewGroup.onInterceptTouchEvent(MotionEvent) - 这允许一个视图组ViewGroup 在分发给子视图时观察这些事件。ViewParent.requestDisallowInterceptTouchEvent(boolean) - 在一个父视图之上调用这个方法来表示它不应该通过onInterceptTouchEvent(MotionEvent)来捕获触摸事件。

触摸模式Touch Mode

当用户使用方向键或跟踪球浏览用户界面时,有必要给用户可操作的item(比如按钮)设置焦点,这样用户可以知道哪个item将接受输入。不过,如果这个设备有触摸功能,而且用户通过触摸来和界面交互,那么就没必要高亮items,或者设定焦点到一个特定的视图。这样,就有一个交互模式 叫“触摸模式”。

对于一个具备触摸功能的设备,一旦用户触摸屏幕,设备将进入触摸模式。自此以后,只有isFocusableInTouchMode()为真的视图才可以被聚焦,比如文本编辑部件。其他可触摸视图,如按钮,在被触摸时将不会接受焦点;它们将只是在被按下时简单的触发on-click侦听器。任何时候用户按下方向键或滚动跟踪球,这个设备将退出触摸模式,然后找一个视图来接受焦点,用户也许不会通过触摸屏幕的方式来恢复界面交互。

触摸模式状态的维护贯穿整个系统(所有窗口和活动)。为了查询当前状态,你可以调用isInTouchMode() 来查看这个设备当前是否处于触摸模式中。

处理焦点Handling Focus

框架将根据用户输入处理常规的焦点移动。这包含当视图删除或隐藏,或者新视图出现时改变焦点。视图通过isFocusable()方法表明它们想获取焦点的意愿。要改变视图是否可以接受焦点,可以调用setFocusable()。在触摸模式中,你可以通过isFocusableInTouchMode()查询一个视图是否允许接受焦点。你可以通过setFocusableInTouchMode()方法来改变它。焦点移动基于一个在给定方向查找最近邻居的算法。少有的情况是,缺省算法可能和开发者的意愿行为不匹配。在这些情况下,你可以通过下面布局文件中的XML属性提供显式的重写:nextFocusDown, nextFocusLeft, nextFocusRight, 和nextFocusUp。为失去焦点的视图增加这些属性之一。定义属性值为拥有焦点的视图的ID。比如:

<LinearLayout

    android:orientation="vertical"

    ... >

  <Button android:id="@+id/top"

          android:nextFocusUp="@+id/bottom"

          ... />

  <Button android:id="@+id/bottom"

          android:nextFocusDown="@+id/top"

          ... />

</LinearLayout>

通常,在这个竖向布局中,从第一个按钮向上浏览或者从第二个按钮向下都不会移动到其它地方。现在这个顶部按钮已经定义了底部按钮为nextFocusUp (反之亦然),浏览焦点将从上到下和从下到上循环移动。

如果你希望在用户界面中声明一个可聚焦的视图(通常不是这样),可以在你的布局定义中,为这个视图增加android:focusable XML 属性。把它的值设置成true。你还可以通过android:focusableInTouchMode在触摸模式下声明一个视图为可聚焦。

想请求一个接受焦点的特定视图,调用requestFocus()。

要侦听焦点事件(当一个视图获得或者失去焦点时被通知到),使用onFocusChange(),如上面事件侦听器Event Listeners一章所描述的那样。

分享到:
评论

相关推荐

    android-studio-ide-193.6514223-windows,完整版下载

    2. 编写代码:在XML布局文件中设计用户界面,使用Java或Kotlin编写业务逻辑。 3. 运行与调试:选择目标设备(物理设备或AVD),点击运行按钮即可部署应用。调试时,可以在代码中设置断点,观察程序运行状态。 4. ...

    android-studio-2021.1.1.21-windows

    3. **直观的用户界面设计**:拖放式的布局编辑器允许开发者快速创建和预览用户界面,同时支持Material Design组件库,让应用设计更具现代感。 4. **强大的调试工具**:内置的调试器可以对应用进行多设备调试,包括...

    android-support-v7-appcompat.zip

    在Android开发中,`android-support-v7-appcompat`库是一个至关重要的组件,它极大地扩展了Android API的功能,使得开发者能够在更广泛的设备上实现一致的用户界面和功能。这个库是Android Support Library系列的一...

    Android-Pdf-Viewer-Library.zip

    4. **事件处理**:库中可能已经预设了一些点击、滚动等事件的处理逻辑,开发者需要了解这些事件处理函数,以便在需要的时候添加自定义功能或修改现有行为。 5. **权限请求**:查看和操作PDF可能需要读取存储权限,...

    Android教程04-用户界面.ppt

    【Android用户界面设计...总结起来,Android用户界面设计涵盖了多个方面,从布局到事件处理,再到组件和图标设计,每个环节都至关重要。开发者需要深入了解这些概念和技术,才能创造出引人入胜且易用的Android应用。

    Android教程04-用户界面开发

    【Android用户界面开发详解】 Android用户界面开发是构建Android应用程序的核心部分,对于初学者来说,理解和掌握这一领域至关重要。在本教程中,我们将深入探讨以下几个关键知识点: 1. **布局(Layout)**:...

    Android-开发指南(中文版).pdf

    Android开发指南中文版是一份涵盖了Android应用开发所有主要概念的指南,它是Android SDK1.5版英文开发资料的中文翻译版本,并且部分内容整理自网络。该指南旨在为技术学习者提供全面的参考,但禁止用于商业用途。 ...

    android-crop-master.zip

    对于开发者来说,深入研究这个项目不仅可以学习到如何在Android中实现图像裁剪功能,还能了解到Android开发中的各种最佳实践,包括代码组织结构、模块化设计、异常处理等方面的知识。同时,如果项目包含详细的文档或...

    Android--开发--LumaQQ-Android--开发-- qq 代码.rar

    1. **用户界面设计**:LumaQQ的界面设计遵循了Android的设计规范,使用了Material Design指南,包括色彩、图标、布局等元素。开发者可以从中学习如何创建符合用户体验的交互式界面。 2. **多线程与异步处理**:在...

    android-support-v4.jar 和 android-support-v7-appcompat.jar

    它的主要目的是引入了ActionBar和Material Design组件的兼容性,使得开发者能够在这些旧版本的设备上实现与新版本相似的用户界面。AppCompat库还包含了对其他新特性的支持,如主题样式、工具栏、导航抽屉等。此外,...

    Android--开发--jChat1.3.rar

    1. **源代码**:分为不同的模块,如用户界面(UI)、网络通信、数据存储、消息处理等。主要语言可能是Java或Kotlin,使用Android架构组件如ViewModel、LiveData等。 2. **资源文件**:包括XML布局文件(activity和...

    Android SDK (SDK Platforms)-android-34-ext8.zip

    Android SDK (SDK Platforms)-android-34-ext8.zip 是一个包含Android SDK中针对Android 34版本特定扩展组件的压缩包。这个包主要是为了开发者在构建和测试Android应用程序时使用,特别是针对Android 13(API级别34...

    android-support-v7-appcompat.rar

    在Android开发中,`android-support-v7-appcompat`库是一个至关重要的组件,它极大地扩展了Android API的功能,使得开发者能够在更广泛的设备上实现一致的用户界面和功能。这个库是Android Support Library系列的一...

    Android Telephony原理解析与开发指南_杨青平.zip

    总结一下,Android Telephony原理解析与开发指南将详细介绍以下几个方面: 1. Dialer与Telecom之间的通信流程,包括拨打、接听、挂断电话的操作。 2. Telecom如何管理电话会话,以及如何调度不同的电话服务。 3. ...

    android-studio-2020.3.1.25-windows.rar

    3. **布局编辑器**:提供了可视化的布局设计界面,允许开发者通过拖放组件来设计用户界面,并实时预览在不同设备上的效果。 4. **虚拟设备管理器(AVD)**:AVD Manager允许创建和管理Android Virtual Devices...

    android-sign-in-up-screen.7z

    在Android应用开发中,用户界面的设计至关重要,尤其是登录和注册屏幕。"android-sign-in-up-screen.7z"这个压缩包文件很可能包含了一套完整的登录和注册界面资源,用于帮助开发者快速构建自己的应用登录功能。在...

    android-android-ui-design-patterns.rar_Android UI Design_Android

    在Android应用开发中,UI(用户界面)设计是至关重要的,因为它直接影响到用户的体验和对应用的接受度。"android-android-ui-design-patterns.rar"是一个压缩包,包含了关于Android UI设计模式的重要资料,特别是...

    SSM-ZTE-AndroidUI-UIDD-0.1 用户界面设计说明1

    【SSM-ZTE-AndroidUI-UIDD-0.1 用户界面设计说明1】文档主要针对的是中兴Android系统的界面软件设计与开发项目,旨在为开发者提供一套详细的设计指南,确保用户界面的一致性、易用性和美观性。以下是根据文档内容...

    Android程序员指南-- Android A Programmers'Guide[中文版]

    3. **用户界面设计**:教授如何使用XML布局文件设计美观且功能齐全的用户界面。 4. **数据存储技术**:讲解如何使用SQLite数据库、SharedPreferences等方式存储应用数据。 5. **网络通信**:介绍HTTP请求、Socket...

    Google官方Android开发教程-入门篇-中文翻译

    1. Google官方Android开发教程的翻译版本: - 这些教程是根据Google Android开发者官网的Training教程翻译而来,目的是为了帮助那些英文阅读能力有限的开发者更好地理解和学习Android开发相关的知识。 - 翻译过程...

Global site tag (gtag.js) - Google Analytics