Android有两套事件处理机制:

1.    基于监听的事件处理

2.    基于回调的事件处理

一、  基于监听的事件处理

是一种基于委托式(Delegation)的事件处理方式。

1、        内部类的形式

2、        匿名类的形式

3、        直接绑定到标签

4、        外部类的形式

5、        Activity本身作为事件监听器

其中前三种较为好用,后两种不常用。

1、2大家都很熟悉了。

3举个例子:在Button标签里写一行代码:android:onClick=”clickHandler”,在该布局对应的Activity里定义一个void clickHandler(View source)方法即可。

4使用外部类的话,有两个缺点:

1、        事件监听器通常属于特定的GUI界面,定义成外部类不利于提高程序的内聚性。

2、        外部类形式的事件监听器不能自由访问创建GUI界面的类中的组件,编程不够简洁。此时需要在此外部类的方法里传递Activity、View作为参数才行。

5的话:

1、        Activity的主要职责是完成界面初始化,但此时还有包含事件处理方法,有点混乱。

2、        如果Activity界面类还要实现监听器接口(implements OnClickListener),让人觉得有点怪异。

二、  基于回调的事件处理

对于基于回调的事件处理模型来说,事件源与事件监听器是统一的,或者说事件监听器完全消失了。当用户在GUI组件上激发某个事件是,组件自己特定的方法将会负责处理该事件。举个例子:

类文件:

public class MyButton extends Button
{publicMyButton(Context context , AttributeSet set){super(context, set);}@Overridepublicboolean onKeyDown(int keyCode, KeyEvent event){super.onKeyDown(keyCode, event);Log.v("-crazyit.org-","the onKeyDown in MyButton");//返回true,表明该事件不会向外扩散returntrue;
}

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><!--使用自定义View时应使用全限定类名 --><org.crazyit.event.MyButtonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="单击我"/>
</LinearLayout>

基于回调的事件传播:

Android系统最先触发的是该按键上绑定的事件监听器,接着触发该组件提供的事件回调方法,然后还会传播到该组件所在的Activity。

public class MyButton extends Button
{publicMyButton(Context context , AttributeSet set){super(context, set);}@Overridepublicboolean onKeyDown(int keyCode, KeyEvent event){super.onKeyDown(keyCode, event);Log.v("-MyButton-","the onKeyDown in MyButton");             //第二个触发//返回false,表明并未完全处理该事件,该事件依然向外扩散returnfalse;}
}
public class MainActivity extends Activity
{@Overridepublicvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);Buttonbn = (Button) findViewById(R.id.bn);//为bn绑定事件监听器bn.setOnKeyListener(newOnKeyListener() {@Overridepublicboolean onKey(View source,int keyCode, KeyEvent event) {//只处理按下键的事件if(event.getAction() == KeyEvent.ACTION_DOWN) {Log.v("-Listener-","the onKeyDown in Listener");}//返回false,表明该事件会向外传播returntrue; // 第①个触发}});}//重写onKeyDown方法,该方法可监听它所包含的所有组件的按键被按下事件@Overridepublicboolean onKeyDown(int keyCode, KeyEvent event){super.onKeyDown(keyCode, event);Log.v("-Activity-", "the onKeyDown in Activity");//返回false,表明并未完全处理该事件,该事件依然向外扩散returnfalse;//第三个触发}
}

三、  响应的系统设置的事件

可使用Configurationcfg = getResourses().getConfiguration();来获取系统的Configuration对象。

如果要使程序自动响应系统设置更改,需要重写Activity的onConfigurationChanged(Configuration neConfig)方法,该方法可用于监听系统设置的更改。

四、Handler消息传递机制

由于Android不允许在子线程中更新界面组件,如果想在子线程中更新界面组件,开发者需要借助于Handler对象来实现。

Handler类的主要作用有两个:

1、        在新启动的线程中发送消息。

2、        在主线程中获取、处理消息。

举个例子:

public class MainActivity extends Activity
{//定义周期性显示的图片的IDint[]imageIds = new int[]{R.drawable.java,R.drawable.javaee,R.drawable.ajax,R.drawable.android,R.drawable.swift};intcurrentImageId = 0;@Overridepublicvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);finalImageView show = (ImageView) findViewById(R.id.show);finalHandler myHandler = new Handler(){@Overridepublicvoid handleMessage(Message msg){//如果该消息是本程序所发送的if(msg.what == 0x1233){//动态地修改所显示的图片show.setImageResource(imageIds[currentImageId++%imageIds.length]);}}};//定义一个计时器,让该计时器周期性地执行指定任务newTimer().schedule(new TimerTask(){@Overridepublicvoid run(){//发送空消息myHandler.sendEmptyMessage(0x1233);}},0, 1200);}
}

Android事件处理相关推荐

  1. Android零基础入门第33节:Android事件处理概述

    原文:Android零基础入门第33节:Android事件处理概述 通过对Android基本组件的学习,也有接触少部分Android的事件处理,比如按钮的点击事件.选框的状态切换事件. 一.Andro ...

  2. Android移动应用基础教程【Android事件处理】

    本章目录 一.事件处理概述 二.基于回调机制的事件处理 三.基于监听接口机制的事件处理 四.手势 1.手势简介 2.手势检测 3.使用GestureLibrary类添加手势 4.使用Gestures ...

  3. 事件争夺战 Android事件处理机制与原理分析

    事件争夺战 Android事件处理机制与原理分析 文章目录 事件争夺战 Android事件处理机制与原理分析 View的继承关系 View的事件处理源码 总结: ViewGroup的事件分发源码 总结 ...

  4. android事件处理概括

    什么是事件处理? 事件处理就是针对用户的一些特定操作,进行相对应的回馈.时间处理也是程序开发中的人机交互的一个非常重要的体现.事件处理中,事件源是事件的起始位. 一.事件处理三要素 事件源--事件-- ...

  5. Android事件处理--读书笔记

    2013-12-28 17:57:17 1. Android提供了两种方式的事件处理:基于回调和基于监听的事件处理: 1.1 对基于监听的事件处理而言,主要做法是为Android界面组件绑定特定的事件 ...

  6. Android 事件处理

    事件就是用户对图形的操作,在android手机和平板电脑上,主要包含物理按键事件和触摸屏事件两类.物理按键事件包含:按下.抬起.长按等:触摸屏事件主要包含按下.抬起.滚动.双击等. 在View中提供了 ...

  7. Android事件处理之处理键盘事件

    1.在Android开发中,首先和用户交互的是界面,接着就是事件处理,对于如今的图形界面应用程序,都是通过事件来实现人机交互的.事件就是用户对图形界面的操作,在Android手机和平板电脑上,主要包括 ...

  8. android事件处理主要方法,详解Android的两种事件处理机制

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

  9. Framework事件机制—Android事件处理的三种方法

    1.1.背景 Android的事件处理的三种方法: 1.基于监听的事件处理机制 setOnClickListener,setOnLongClickListener.setOnTouchListener ...

  10. Android事件处理之多点触摸与手势识别

    为什么80%的码农都做不了架构师?>>>    一.Muilti-touch 双指缩放的实现探索: 首先要实现OnTouchListener接口,然后重写方法: public boo ...

最新文章

  1. 到底选择PostgreSOL还是MySQL?看这里!
  2. openssl生成证书linux,linux中openssl生成证书和自签证书linux操作系统 -电脑资料
  3. 方法描述Mybatis使用之NEIS项目
  4. obj,lib,dll,exe
  5. dell服务器从硬盘引导,就是折腾 篇三:戴尔H710 mini(D1版本)阵列卡刷直通模式 附硬盘引导和还原IR模式办法...
  6. 通用Excel文件导出工具类
  7. java keyadapter_在java中使用keyAdapter和keyEvent时出错
  8. Leetcode--523. 连续的子数组和
  9. CVPR 2017精彩论文解读:综合使用多形态核磁共振数据的3D生物医学图像分割方法 | 分享总结...
  10. 正则表达式验证注册页面
  11. c51单片机外部中断汇编语言,51单片机汇编语言外部中断笔记
  12. 亚信安全助手、杀毒软件卸载
  13. java当前日期_Java 获取当前日期的四种方法
  14. 为你的网站添加一个帅气的IP签名档吧 – 教程附源码
  15. 北京交通大学计算机学院篮球,院际杯篮球赛|土建计算机相会决赛!男篮半决赛战报...
  16. Opus:IETF低延迟音频编解码器:API和操作手册
  17. 花指令的原理、常用花指令收集及花指令示例
  18. 第一章:基于Visual C++ 6.0使用运动控制卡控制电机转动实验操作指导
  19. LED驱动电源EMI整改方案
  20. vars()函数详解

热门文章

  1. linux 进程间通信机制(IPC机制)一消息队列
  2. CentOS 6.5 shell中su切换自动输入密码
  3. iOS 开发 初级:应用内购买 In-App Purchase
  4. CentOS 5 常见的configure error的解决方法
  5. Phone Bills【PAT 1016题】--- 电话账单结算
  6. RedHat Linux RHEL6配置本地YUM源
  7. linux fedora frebsd centos linux as 安装出错
  8. explain mysql执行顺序_面试前必须知道的MySQL命令【explain】
  9. python elasticsearch dsl_python 查询 elasticsearch 常用方法(Query DSL)
  10. 接口接收数据_基于原语的千兆以太网RGMII接口设计