Android提供了强大的事件处理机制,它包括两套处理机制:
1.基于监听的事件处理
2.基于回调的事件处理
对于Android基于监听的事件处理,主要的做法是为Android界面组件绑定特定的事件监听器。
对于Android基于回调的事件处理,主要的方法是重写Android组件特定的回调方法或者重写
Activity的回调方法

一、基于监听的事件处理
在事件监听的处理模型中,主要涉及如下三类对象:
1.Event Source(事件源):事件发生的场所,通常就是各个组件、例如按钮、窗口、菜单等。
2.Event(事件):事件封装了界面组件上发生的特定事情(通常就是一次用户操作)。
3.Event Listener(事件监听器):扶着监听事件源所发生的事件,并对各种事件做出相应的响应。
事件处理流程示意图如下:

内部类可以作为事件监听器类,如果某个监听器要被多个GUI界面所共享我们可以使用外部类
作为事件监听器类,还有一种是匿名内部类作为事件监听器类,这里就不详细介绍了。

Android还中还有一种更简单的绑定事件监听器的方式,直接在界面布局中为指定的标签绑定事件处理方法。
如:android:onClick="clickHandler",这样就意味着开发者需要在该界面布局对应的Activity中定义一个void clickHandler(View source),该方法将会处理该按钮上的单击事件。
下面我们来看一段Java代码:
[java]view plaincopy
  1. publicclassEx003_01ActivityextendsActivity{
  2. /**Calledwhentheactivityisfirstcreated.*/
  3. @Override
  4. publicvoidonCreate(BundlesavedInstanceState){
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.main);
  7. //定义一个事件的处理方法
  8. //轻重source参数代表事件源
  9. publicvoidclickHandler(Viewsource){
  10. TextViewshow=(TextView)findViewById(R.id.tv);
  11. show.setText("bn按钮被点击了");
  12. }
  13. }
  14. }

二、基于回调事件处理
从代码的实现的角度来看,基于回调的事件处理模型更加简单。如果说事件监听制是一种委托式的事件处理,那么回调机制恰好与之相反:对于基于回调机制的事件处理模型来说,事件源与事件监听器是统一的。为了使用回调机制类处理GUI组件上所发生的事件,我们需要为该组件提供对应的事件处理方法--而Java又是一种静态语言,我们无法为某个对象动态的添加方法,因此只能继承GUI组件类,并重写该组件类的事件处理方法来实现。
为了实现回调机制的事件处理,Android为所有的GUI组件都提供了一些事件处理的回调方法,以View为例,该类包含如下方法:
boolean onKeyDown(int keyCode,KeyEvent event):当用户在该组件上按下某个键时触发的方法。
boolean onKeyLongPress(int keyCode,KeyEvent event):当用户在该组件上长按某个按钮时触发该方法。
boolean onKeyShortcut(int keyCode,KeyEvent event): 当一个快捷键事件发生时触发该放过。
boolean onKeyUp(int keyCode,KeyEvent event):当用户在该组件上松开某个按键时触发该方法
boolean onTouchEvent(MotionEvent event):当用户在该组件上触发触摸屏事件时触发该方法。
boolean onTrackballEventI(MotionEvent event):当用户在该组件上触发轨迹球屏事件时触发该事件。
下面我们来看一段代码:
[java]view plaincopy
  1. publicclassMyButtonextendsButton
  2. {
  3. publicMyButton(Contextcontext,AttributeSetset)
  4. {
  5. super(context,set);
  6. //TODOAuto-generatedconstructorstub
  7. }
  8. @Override
  9. publicbooleanonKeyDown(intkeyCode,KeyEventevent)
  10. {
  11. super.onKeyDown(keyCode,event);
  12. Log.v("-crazyit.org-","theonKeyDowninMyButton");
  13. //返回true,表明该事件不会向外扩散
  14. returntrue;
  15. }
  16. }


上面的代码我们重写了Button类的onKeyDown(int keyCode,KeyEvent event)方法,该方法将会负责处理按钮上的键盘事件。

基于回调的事件传播
几乎所有的基于回调的事件处理方法都有一个boolean类型的返回值,该返回值用于标识该处理方法是否能完全处理该事件:
1.如果返回true,则表明该处理方法已完全处理了该事件,该事件不会被传播出去。
2.如果返回false,表明该处理方法未完全处理该事件,该事件会传播出去。
对于基于回调的事件处理传播而言,某组件上所发生的事情不仅激发该组件上的回调方法,也会触发该组件所在的Activity的回调方法——只要事件能传播到该Activity。

更多相关文章

  1. Android 桌面组件【widget】初探
  2. Android的事件处理模式
  3. 源码角度分析Android的事件输入系统(input system)及ANR原理分析
  4. Android 4.4 Dialog 被状态栏遮挡的解决方法
  5. android系统裁剪方法
  6. 阅读《Android 从入门到精通》(4)——人机界面常用组件概述

随机推荐

  1. 对于http协议的理解
  2. vscode常用插件(持续更新)
  3. 各地监管加强 矿圈“凉凉”
  4. Ajax请求实例,与懒加载技术
  5. vs code常用插件下载与http协议入门知识
  6. Ajax中的get与post请求,选项卡与懒加载技
  7. 前端作业-JavaSctipt 07-07作业
  8. javascript_0707作业
  9. 解答大家对于Google SEO最关心的几个问题
  10. 2009年QQ群关系数据库可视化查询器优化推