Android--事件处理

简介:

Android提供了强大的事件处理机制,包括两套事件处理机制:

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

 

一、基于监听的事件处理

  在事件监听的处理模型中,主要涉及如下三类对象:

  •   Event Source(事件源):事件发生的场所,通常就是各个组件。
  •   Event(事件):事件封装了界面组件换上发生的特定事情。
  •   Event Listener(事件监听器):负责监听事件源所发生的事件,并对各种时间做出相应的相应。

 

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

 

  所谓事件监听器,其实就是实现了特定接口的Java类的实例。在程序中实现事件监听器,通常有如下几种形式:

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

 

1、外部类形式

  使用顶级类定义事件监听器类的形式比较少见,所以不推荐使用,主要因为如下两个原因:

  •   事件监听器通常属于特定的GUI界面,定义成外部类不利于提高程序的内聚性。
  •   外部类形式的事件监听器不能自由访问创建GUI界面的类中的组件,编程不够简洁。

  使用步骤:

  1.   创建一个新类,实现需要监听事件的监听器接口。
  2.   在使用的时候,给某事件源的特定事件绑定此类。

示例:

事件处理类,监听了OnLongClick事件。

复制代码
public class SendSmsListener implements OnLongClickListener {
    
    private Activity act;
    public SendSmsListener(Activity act)
    {
        this.act=act;
    }
    public boolean onLongClick(View arg0) {
        // 事件处理逻辑
        return false;
    }
}
复制代码

调用:

复制代码
public class Main extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button btn=(Button)this.findViewById(R.id.button1);
        btn.setOnLongClickListener(new SendSmsListener(this));       
    }
}
复制代码

 

2、Activity本身作为事件监听器类

  这种形式使用Activity本身作为监听器类,只需实现需要的监听器接口,就可以直接在Activity类中定义事件处理方法,这种形式非常简洁。但是这种形式可能造成程序结构混乱,因为Activity的主要职责是完成界面初始化工作。

示例 :

复制代码
public class Main extends Activity implements OnClickListener{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button btn=(Button)this.findViewById(R.id.button1);
        btn.setOnClickListener(this);//绑定Activity的OnClick事件
    }

    public void onClick(View v) {
        // 事件处理逻辑        
    }
}
复制代码

 

3、直接绑定到XML标签中

  在Android中,可以直接把事件处理绑定到XML标签中。

示例:

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" 
        android:onClick="btnClick"/>

处理事件:

复制代码
public class Main extends Activity{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);  
    }

    public void btnClick(View v) {
        // 事件处理逻辑        
    }
}
复制代码

4、匿名内部类作为事件监听器

  因为大部分时候,事件处理器都是没有复用价值的,因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更合适。这也是最广泛的用法。

示例:

复制代码
public class Main extends Activity{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button btn=(Button)this.findViewById(R.id.button1);
        btn.setOnClickListener(new OnClickListener() {            
            public void onClick(View v) {
                // 事件处理逻辑                
            }
        });       
    }    
}
复制代码

 

 

二、基于回调的事件处理

  对于基于回调的事件处理模型来说,事件源与事件监听器是统一的,或者说事件监听器完全消失了。当用户在GUI组件上激发某个事件时,组件自己特定的方法将会负责处理该事件。此处理方法一般会有一个boolean类型的返回值,该返回值用于标识该处理方法是否能完全处理该事件。如果返回true,表明该处理方法已完全处理该事件,该事件不会传播出去。如果返回false,表明该处理方法并未完全处理该事件,该事件会传播出去。

  基于回调的事件处理方式主要用于重写新的组件,继承原组件的类,然后对其事件进行重写。在布局的时候,直接使用重写好的新组件。此时如果触发事件,则由新组件执行处理。(此方式一般不常用)

示例:

复制代码
public class Mybutton extends Button {
    public Mybutton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }    
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        super.onKeyDown(keyCode, event);
        //事件处理逻辑
        return true;//表示该事件不会像外扩散
    }
}
复制代码

 

总结:对于基于监听的事件处理模型来说,事件源和事件监听器是分离的,当事件源上发生特定事件之后,该事件交给事件监听器负责处理;对于基于回调的事件处理模型来说,事件源和事件监听器是统一的,当事件源发生特定事件之后,该事件还是由事件源本身负责处理。



本文转自承香墨影博客园博客,原文链接:http://www.cnblogs.com/plokmju/archive/2013/03/13/2955175.html,如需转载请自行联系原作者


相关文章
|
8月前
|
XML Android开发 数据格式
Android 基于监听的事件处理机制详解
Android 基于监听的事件处理机制详解
58 0
|
8月前
|
Android开发
Android 基于回调的事件处理机制详解
Android 基于回调的事件处理机制详解
64 0
|
Android开发
【Android 应用开发】Android中的回调Callback
【Android 应用开发】Android中的回调Callback
613 0
|
Android开发
Android--按钮点击事件
  Android中Button的点击事件非常简单,主要是一个内部类的问题   在界面上存在两个按钮和一个文本框,点击不同按钮的时候文本框中显示不同按钮的文字信息   布局代码xml...
1136 0
|
Android开发 数据格式 XML
监听android:drawableLeft和android:drawableRight点击事件
监听android:drawableLeft和android:drawableRight点击事件 Android官方没有提供对android:drawableLeft和android:drawableRight点击事件的监听,但有些情况下,如下面的搜索栏, 需要在用户输入字符点击左侧的搜索图标后触发搜索事件,而此搜索icon是通过android:drawableLeft添加的,此时就需要对android:drawableLeft上去的icon进行事件监听。
2073 0
|
Java Android开发
Android零基础入门第35节:Android中基于回调的事件处理
原文:Android零基础入门第35节:Android中基于回调的事件处理    通过前面两期掌握了Android中基于监听的事件处理的五种形式,那么本期一起来学习Android中基于回调的事件处理。     一、基于回调的事件处理概述       基于监听的事件处理机制,简单说就是为事件源(组件)添加一个监听器,然后当用户触发了事件后交给监听器去处理,根据不同的事件执行不同的操作。
1339 0
|
XML Java Android开发
Android零基础入门第34节:Android中基于监听的事件处理
原文:Android零基础入门第34节:Android中基于监听的事件处理    上一期我们学习了Android中的事件处理,也详细学习了Android中基于监听的事件处理,同时学会了匿名内部类形式,那么本期继续来学习其他四种事件监听器。
1263 0
|
XML Android开发 数据格式