http://www.cnblogs.com/plokmju/archive/2013/03/13/2955175.html

Android有两条事件处理机制

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

一、基于监听的事件处理

监听的处理关系到三个对象:

  • Event Source:事件发生的场所,通常时各个组件
  • Event:事件内容
  • Event Listener:事件监听器,负责监听组件上发生的事件,并作出相应的处理

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

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

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

1、外部类形式

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

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

  使用步骤:

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

示例:

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

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) {
// 事件处理逻辑
}
}

调用:

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;//表示该事件不会像外扩散
}
}

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

Android-事件处理机制(待补充)的更多相关文章

  1. Android事件处理机制

    包括监听和回调两种机制. 1. 基于监听的事件处理: 事件监听包含三类对象,事件源,事件,事件监听器.Android的事件处理机制是一种委派式(Delegation)事件处理方式:普通组件(事件源)将 ...

  2. android 事件处理机制之requestDisallowInterceptTouchEvent

    当手指触摸到屏幕时,系统就会调用相应View的onTouchEvent,并传入一系列的action.当有多个层级的View时,在父层级允许的情 况下,这个action会一直向下传递直到遇到最深层的Vi ...

  3. Android的两种事件处理机制

    UI编程通常都会伴随事件处理,Android也不例外,它提供了两种方式的事件处理:基于回调的事件处理和基于监听器的事件处理. 对于基于监听器的事件处理而言,主要就是为Android界面组件绑定特定的事 ...

  4. Android的Touch事件处理机制

    Android的Touch事件处理机制比较复杂,特别是在考虑了多点触摸以及事件拦截之后. Android的Touch事件处理分3个层面:Activity层,ViewGroup层,View层. 首先说一 ...

  5. Android的事件处理机制详解(二)-----基于监听的事件处理机制

    基于监听的事件处理机制 前言: 我们开发的app更多的时候是需要与用户的交互----即对用户的操作进行响应 这就涉及到了android的事件处理机制; android给我们提供了两套功能强大的处理机制 ...

  6. Android的事件处理机制(一)------基于回调机制的事件处理

    Android平台的事件处理机制有两种,一种是基于回调机制的,一种是基于监听接口的,现介绍第一种:基于回调机制的事件处理.Android平台中,每个View都有自己的处理事件的回调方法,开发人员可以通 ...

  7. Android平台的事件处理机制和手指滑动例子

    Android平台的事件处理机制有两种 基于回调机制的事件处理:Android平台中,每个View都有自己的处理事件的回调方法,开发人员可以通过重写View中的这些回调方法来实现需要的响应事件. 基于 ...

  8. Android——事件处理模型一(基于回调机制的事件处理)(转)

    Android平台的事件处理机制有两种,一种是基于回调机制的,一种是基于监听接口的,现介绍第一种:基于回调机制的事件处理.Android平台中,每个View都有自己的处理事件的回调方法,开发人员可以通 ...

  9. Android基础新手教程——3.1 基于监听的事件处理机制

    Android基础新手教程--3.1.1 基于监听的事件处理机制 标签(空格分隔): Android基础新手教程 本节引言: 第二章我们学习的是Android的UI控件,我们能够利用这些控件构成一个精 ...

  10. Android的事件处理机制之基于回调的事件处理

    回调机制 如果说事件监听机制是一种委托式的事件处理,那么回调机制则与之相反,对于基于回调的事件处理模型来说,事件源与事件监听器是统一的,换种方法说事件监听器完全消失了,当用户在GUI组件上激发某个事件 ...

随机推荐

  1. 洛谷P2761 软件补丁问题(状压dp)

    传送门 啊咧……这题不是网络流二十四题么……为啥是个状压dp…… 把每一个漏洞看成一个状态,直接硬上状压dp 然后因为有后效型,得用spfa //minamoto #include<iostre ...

  2. xtrabackup使用

    转自:https://www.cnblogs.com/waynechou/p/xtrabackup_backup.html 阅读目录 xtrabackup 选项 xtrabackup 全量备份恢复 x ...

  3. SpringBoot Maven多模块整合MyBatis 打包jar

    最近公司开始新的项目,框架选定为SpringBoot+Mybatis,本篇主要记录了在IDEA中搭建SpringBoot多模块项目的过程. 源码:https://github.com/12641561 ...

  4. 数据结构实验之图论七:驴友计划 ( 最短路径 Dijkstra 算法 )

    数据结构实验之图论七:驴友计划 Time Limit: 1000 ms           Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...

  5. 条目十四《使用reserve来避免不必要的重新分配》

    条目十四<使用reserve来避免不必要的重新分配> 使用vector和string的插入元素的时候,我们是不用担心内存问题的(只要不超过容器的max_size).因为底层有分配子管理内存 ...

  6. Maven搭建Spring+SpringMVC+Mybatis+Shiro项目详解

    一. 环境搭建: 1. 开发工具:myeclipse 2014 / IDEA: 2. maven管理版本:apache-maven-3.0+: 3. jdk 1.7.0+4. Tomcat8.0 二: ...

  7. CentOS 7 安装中网络设置111

    如果在安装过程中需要使用网络,需要启动网卡,默认是DHCP 点击configure进入设置 General 常规设置 Automatically connect to this network whe ...

  8. npm i -S -D -g 区别

    npm install 本身就有一个别名 npm i npm i module_name -S    即    npm install module_name --save     写入depende ...

  9. C++_代码重用3-私有继承

    使用包含:易于理解,类声明中包含表示被包含类的显式命名对象,代码可以通过名称引用这些对象: 使用继承:将使关系更抽象,且继承会引起很多问题,尤其是从多个基类继承时. 私有继承所提供的特性确实比包含多. ...

  10. flume将数据发送到kafka、hdfs、hive、http、netcat等模式的使用总结

    1.source为http模式,sink为logger模式,将数据在控制台打印出来. conf配置文件如下: # Name the components on this agent a1.source ...