作者:郭孝星
微博:郭孝星的新浪微博
博客:http://blog.csdn.net/allenwells
Github:https://github.com/AllenWells
事件处理:不管是桌面应用还是手机应用都需要去响应用户的动作,这种为用户动作提供响应的机制就是事件处理。
Android提供了两套事件处理机制,如下所示:
- 基于监听的事件处理
- 基于回调的事件处理
一般来说,基于回调的事件处理可用于处理一些通用性的事件,但对于某些特定的事件只能使用基于监听的事件处理。而且基于监听的事件处理会被优先触发。
下面我们来详细介绍一些这两种事件处理方式。
一 基于监听的事件处理
基于监听的事件处理是一种委派式的事件处理机制,普通组件(事件源)将整个事件处理委托给特定的对象(事件监听器),当该事件源发生指定的事件时,就通知所委托的事件监听器,由事件监听器来处理这个事件。
1.1 基于监听的事件处理模型
在基于监听的事件处理模型包含以下3类对象:
- 事件源:即Event Source,事件发生的场所,通常就是各组件。
- 事件:即Event,事件封装了界面组件发生的特定事情,通常是一次用户的相关操作,如果程序需要获得界面组件上所放生事件的相关信息,一般是通过Event对象来取得。
- 事件监听器:即Event Listener,负责监听事件源所发生的事件,并对各种事件作出响应。
基于监听的事件处理模型如下图所示:
1.2 事件源监听器
基于监听的事件处理编程步骤如下所示:
- 获取普通界面组件(事件源),即被监听的对象。
- 实现事件监听器类,该类实现一个XxxListener的接口。
- 调用事件源的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,表明该处理方法并未能完全处理该事件,该事件会传播出去。
-
版权声明:当我们认真的去做一件事的时候,就能发现其中的无穷乐趣,丰富多彩的技术宛如路上的风景,边走边欣赏。
时间: 2024-10-12 12:30:39