android学习笔记(46)android基于监听的事件处理

文章标签: android,android-事件
2015-1-19 18:06:33     人阅读    

           不管是桌面应用还是手机应用程序,面对最多的就是用户,经常需要处理的就是用户动作也就是需要为用户动作提供响应,这种为用户动作提供响应的机制就是事件处理。 Android提供了强大的事件处理机制,包括两套事件处理机制:


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

          对于Android基于监听的事件处理而言,主要做法就是为Android界面组件绑定特定的 事件监听器,上一章我们己经见到大量这种事件处理的示例。
           对于Android基于回调的事件处理而言,主要做法就是重写Android组件特定的回调方 法,或者重写Activity的回调方法。Android为绝大部分界面组件都提供了事件响应的回调方 法,开发者只要重写它们即可。

           一般来说,基于回调的事件处理可用于处理一些具有通用性的事件,基于回调的事件处 理代码会显得比较简洁。但对于某些特定的事件,无法使用基于回调的事件处理,只能采 用基于监听的事件处理。


         基于监听的事件处理
           基于监听的事件处理是一种更“面向对象”的事件处理,这种处理方式与Java的AWT、 Swing的处理方式几乎完全相同。如果开发者有AWT、Swing事件处理的编程经验,基本上 可以直接上手编程,甚至不需要学习。如果以前没有任何事件处理的编程经验,就需要花点 时间先去理解事件监听的处理模型。


          事件监听的处理模型
在事件监听的处理模型中,主要涉及如下三类对象。
         Event Source (事件源):事件发生的场所,通常就是各个组件,例如按钮、窗口、 菜单等。
         Event (事件):事件封装了界面组件上发生的特定事情(通常就是一次用户操作)。

 

 


         如果程序需要获得界面组件上所发生事件的相关信息,一般通过Event对象来取得。 > Event Listener (事件监听器):负责监听事件源所发生的事件,并对各种事件做 出相应的响应。

 

         上就是一系列程序语句,通常以方法的形式组织起来。但Java是面向对象的编程 语言,方法不能独立存在,所以必须以类的形式来组织这些方法,所以事件监听器 的核心就是它所包含的方法这些方法也被称为事件处理器(Event Handler )。


         当用户按下一个按钮或者单击某个菜单项时,这些动作就会激发一个相应的事件,该事 件就会触发事件源上注册的事件监听器(特殊的Java对象),事件监听器调用对应的事件处 理器(事件监听器里的实例方法)来做出相应的响应。


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


          每个组件均可以针对特定的事件指定一个事件监听器,每个事件监听器也可监听一个或 多个事件源。因为同一个事件源上可能发生多种事件,委派式事件处理方式可以把事件源上 所有可能发生的事件分别授权给不同的事件监听器来处理;同时也可以让一类事件都使用同 一个事件监听器来处理。

 

          委派式事件处理方式明显“抄袭”了人类社会的分工协作,例如某个单位发生了火灾,该单位通常不会自己处理该事件,而是将该事件委派给消防局(事件监听器) 处理;如果发生了打架斗殴事件,则委派给公安局(事件监听器)处理;而消防局、 公安局也会同时监听多个单位的火灾、打架斗殴事件。这种委派式的处理方式将事件 源和事件监听器分离,从而提供更好的程序模型,有利于提高程序的可维护性。


          下面以一个简单的入门程序来示范简单的基于监听的事件处理模型。
先看本程序的界面布局代码,该界面布局中只是定义了两个组件:一个文本框和一个按钮,界面布局代码如下。
程序清单:EventQs\res\layout\main.xml

<?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/txt"
 android:layout_width="fill_parent" 
 android:layout_height="wrap_content" 
 android:editable="false"
 android:cursorVisible="false"
 android:textSize="12pt"
 />
<!-- 定义一个按钮,该按钮将作为事件源 -->
<Button 
 android:id="@+id/bn"
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content" 
 android:text="单击我"
 /> 
</LinearLayout>

上面的程序中定义的按钮将会作为事件源,接下来程序将会为该按钮绑定一个事件监听 器——监听器类必须由开发者来实现。下面是Java程序代码。
程序清单:EventQs\src\org\crazyit\listener\EventQs.java

package org.crazyit.listener;

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

public class EventQs extends Activity
{
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  //获取应用程序中的bn按钮
  Button bn = (Button)findViewById(R.id.bn);
  //为按钮绑定事件监听器。
  bn.setOnClickListener(new MyClickListener());
 }
 //定义一个单击事件的监听器
 class MyClickListener implements View.OnClickListener
 {
  //实现监听器类必须实现的方法,该方法将会作为事件处理器
  @Override
  public void onClick(View arg0)
  {
   EditText txt = (EditText)findViewById(R.id.txt);
   txt.setText("bn按钮被单击了!");
  }  
 }
}

          上面的程序中粗体字代码定义了一个View.OnClickListener实现类,这个实现类将会作为 事件监听器使用。程序中①号代码用于为bn按钮注册事件监听器。当程序中的bn按钮被单 击时,该处理器被触发,将看到程序中文本框内变为“bn按钮被单击了”。
           从上面的程序中可以看出,基于监听的事件处理模型的编程步骤如下。
           1、获取普通界面组件(事件源),也就是被监听的对象。
           2、实现事件监听器类,该监听器类是一个特殊的Java类,必须实现一个XxxListener 接口。
           3、调用事件源的setXxxListener方法将事件监听器对象注册给普通组件(事件源)。
           4、当事件源上发生指定事件时,Android会触发事件监听器,由事件监听器调用相应的方 法(事件处理器)来处理事件。
           5、把上面的程序结合起来看,可以发现基于监听的事件处理有如下规则。
           事件源:就是程序中的bn按钮,其实开发者不需要太多的额外处理。应用程序中 任何组件都可作为事件源。
          事件监听器:就是程序中的MyClickListener类。监听器类必须由程序员负责实现, 实现监听器类的关键就是实现处理器方法。
          注册监听器:只要调用事件源的setXxxListener(XxxListener)方法即可。
         上面三件事情,事件源可以是任何界面组件,不太需要开发者参与;注册监听器也只要 一行代码即可,因此事件编程的关键就是实现事件监听器类。


原文地址:http://www.itmmd.com/201501/520.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

android ListView中删除多条数据   上一篇
下一篇  android : java.lang.NoClassDefFoundError: com.google.android.gms.R$styleable
精彩回复
我要追加问题,请求站长解决!
姓名:       

《程序员app》专门为程序员量身定做!