作者:郭孝星
微博:郭孝星的新浪微博
邮箱:allenwells@163.com
博客:http://blog.csdn.net/allenwells
Github:https://github.com/AllenWells

事件处理:不管是桌面应用还是手机应用都需要去响应用户的动作,这种为用户动作提供响应的机制就是事件处理。

Android提供了两套事件处理机制,如下所示:

  • 基于监听的事件处理
  • 基于回调的事件处理

一般来说,基于回调的事件处理可用于处理一些通用性的事件,但对于某些特定的事件只能使用基于监听的事件处理。而且基于监听的事件处理会被优先触发。

下面我们来详细介绍一些这两种事件处理方式。

一 基于监听的事件处理

基于监听的事件处理是一种委派式的事件处理机制,普通组件(事件源)将整个事件处理委托给特定的对象(事件监听器),当该事件源发生指定的事件时,就通知所委托的事件监听器,由事件监听器来处理这个事件。

1.1 基于监听的事件处理模型

在基于监听的事件处理模型包含以下3类对象:

  • 事件源:即Event Source,事件发生的场所,通常就是各组件。
  • 事件:即Event,事件封装了界面组件发生的特定事情,通常是一次用户的相关操作,如果程序需要获得界面组件上所放生事件的相关信息,一般是通过Event对象来取得。
  • 事件监听器:即Event Listener,负责监听事件源所发生的事件,并对各种事件作出响应。

基于监听的事件处理模型如下图所示:

基于监听的事件处理模型Visio源文件下载

这里写图片描述

1.2 事件源监听器

基于监听的事件处理编程步骤如下所示:

  1. 获取普通界面组件(事件源),即被监听的对象。
  2. 实现事件监听器类,该类实现一个XxxListener的接口。
  3. 调用事件源的setXxxListener方法将事件监听器对象注册给普通组件。

举例

定义一个Button作为事件源

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"
>

<EditText
android:id="@+id/show"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:editable="false"
/>

<Button
android:id="@+id/bn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="单击我"
/>

</LinearLayout>

实现监听器监听事件源。

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

// 实现事件监听器接口
public class ActivityListener extends Activity
implements OnClickListener
{

EditText show;
Button bn;

@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
show = (EditText) findViewById(R.id.show);
bn = (Button) findViewById(R.id.bn);
// 直接使用Activity作为事件监听器
bn.setOnClickListener(this);
}

// 实现事件处理方法
@Override
public void onClick(View v)
{
show.setText("bn按钮被单击了!");
}
}

在在基于监听的事件处理模型包含以下3类对象中,事件源随处可见,事件由Android系统产生,所以我们需要关注的主要还是实现事件监听器,常见的事件监听器有4种,如下所示:

  • 内部类形式:将事件监听器定义成当前类的内部类。
  • 外部类形式:将事件监听器定义成一个外部类。
  • Activity本身作为事件监听器:让Activity本身实现监听器接口,并实现事件处理方法。
  • 匿名内部类形式:使用匿名内部类创建事件监听器对象。

二 基于回调的事件处理

基于回调的事件处理没有事件监听器,当用户在界面组件激发某个事件时,组件自己特定的方法将会负责处理该事件。

2.1 基于回调的事件传播

几乎所有基于回调的时间处理方法都有一个boolean类型的返回值,该返回值用于标识该处理方法是否能完全处理该事件。

  • 如果处理事件的回调方法返回true,表明该处理方法已能完全处理该事件,该事件不会传播出去。
  • 如果处理事件的回调方法返回false,表明该处理方法并未能完全处理该事件,该事件会传播出去。

  • -

更多相关文章

  1. Android View事件传播机制
  2. 无法向CalendarView事件添加侦听器
  3. AutoCompleteTextView 设置了点击事件需要点击两下解决办法
  4. android 模拟键盘鼠标事件(adb shell)
  5. 防止回收利用触摸事件
  6. android里通过什么什么事件可以拿到由于click后的EditText的光标
  7. java中的事件监听问题,如何将菜单项与组合框相关联
  8. java中的大事件
  9. Javascript 事件对象(六)事件默认行为

随机推荐

  1. Android 图片加载Bit地图 OOM异常解决方
  2. Android进程与线程基本知识一
  3. 微软的 Android 计划:邪恶的天才计划或只
  4. android Setting中隐藏项实现原理与代码
  5. Android架构组件—LiveData
  6. android虚拟器启动慢的问题
  7. eclipse开发Android必备环境搭建
  8. Android下的单元测试
  9. Android(安卓)图片压缩也即生成缩略图方
  10. Android NDK环境配置与开发