【Android应用开发技术:应用组件】Android事件处理机制

作者:郭孝星
微博:郭孝星的新浪微博
邮箱: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,表明该处理方法并未能完全处理该事件,该事件会传播出去。

  • -
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值