回调机制

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

使用回调机制类处理GUI组件上所发生的事件时,我们需要为该组件提供所对应的事件处理方法--该事件处理方法通常都是系统预先定义好的,因此通常需要继承GUI组件类,并通过重写该类的处理方法来实现。

为了实现回调机制的事件处理,Android为所有GUI组件都提供了一些事件处理的回调方法,以View为例,该类有如下方法:

  • boolean onKeyDown(int keyCode,KeyEvent event);当用户在该组件按下某个按键时触发该方法。
  • boolean onKeyLongPress(int keyCode,KeyEvent event);当用户在该组件长按下某个按键时触发该方法。
  • boolean onKeyShorcut(int keyCode,KeyEvent event);当一个键盘快捷键事件发生时触发该方法。
  • boolean onKeyUp(int keyCode,KeyEvent event);当用户在该组件上松开某个按键时触发该方法。
  • boolean onTouchEvent(MotionEvent event);当用户在该组件触发触摸屏事件时触发该方法。
  • boolean onTrackballEvent(MotionEvent event);当用户在该组件上触发轨迹球事件时触发该方法。

如下的程序展示了基于回调的事件处理机制。正如前面所提到的,基于回调的事件处理机制可以通过自定义View来实现,自定义View时重写该View的事件处理方法即可。

MyButton.java

 public class MyButton extends Button
{
public MyButton(Context context, AttributeSet set)
{
super(context, set);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
Log.v("-com.example-", "the onTouchEvent in MyButton");
// 返回true,表明该事件不会向外传播
return true;
}
}

在上面自定义的MyButton类中,我们重写了Button类的onTouchEvent(MotionEvent event)方法,该方法将会负责处理按钮上的用户触碰事件。

部分界面文件如下。

 <!-- 使用自定义View时应使用全限定类名 -->
<org.crazyit.event.MyButton
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="单击我" />

运行上面的程序在Logcat有如下显示

基于回调的事件传播

几乎所有基于回调的事件处理方法都有一个Boolean类型的返回值,该返回值用于标识该处理方法能否完全处理该事件。

  • 如果处理事件返回true,则表明处理方法已经完全处理该事件,该事件不会传播出去。

  • 如果处理事件返回false,则表明处理方法并未完全处理该事件,该事件会传播出去。

对于基于回调的事件传播而言某组件上所发生的事件不仅会激发该组件上的回调方法,也会触发该组件所在Activity的回调方法--只要事件能传播到Activity。

如下的程序示范了Android系统中的事件传播,重写Button类的处理方法时没有阻止事件传播,因此能看到事件从Button传播到Activity的情形。

MyButton.java

 public class MyButton extends Button
{
public MyButton(Context context, AttributeSet set)
{
super(context, set);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
Log.v("-com.example-", "the onTouchEvent in MyButton");
// 返回false,表明该事件会向外传播
return false; // ①
}
}

上面的MyButton子类重写了onTouchEvent方法,当用户触碰该按钮时将会触发该方法,但由于该方法返回了false,这意味着事件还会继续向外传播。

接下来看下Activity类代码

 public class MainActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bn = findViewById(R.id.bn);
bn.setOnTouchListener((view, event) ->
{
// 只处理按下键的事件
if (event.getAction() == MotionEvent.ACTION_DOWN) {
Log.v("--Listener--", "the TouchDown in Listener");
}
// 返回false,表明该事件会向外传播
return true;
});
}
// 重写onTouchEvent方法,该方法可监听它所包含的所有组件上的触碰事件
@Override
public boolean onTouchEvent(MotionEvent event)
{
super.onTouchEvent(event);
Log.v("--Activity--", "the onTouchEvent in Activity");
// 返回false,表明该事件会向外传播
return false;
}
}

运行上面的程序,触碰按钮,可以在Logcat中看的如下的输出。

从上图中不难看出,当该组件发生触碰事件时,Android系统最先触发的应该是组件绑定的监听器,然后再触发组件提供的事件回调方法,最后还会传播到该组件所在的Activity。但如果任何一个事件处理方法返回了true,那么该事件都不会继续向外传播。例如改写监听器代码,返回为true,然后再运行并触碰按钮,那么在Logcat上会看的如下的输出。

注:本文部分内容参考《疯狂Android讲义》一书,侵权必删

Android的事件处理机制之基于回调的事件处理的更多相关文章

  1. Android笔记二十四.Android基于回调的事件处理机制

        假设说事件监听机制是一种托付式的事件处理,那么回调机制则与之相反,对于基于回调的事件处理模型来说,事件源和事件监听器是统一的,或者说事件监听器全然消失了,当用户在GUI控件上激发某个事件时,控 ...

  2. Android零基础入门第35节:Android中基于回调的事件处理

    原文:Android零基础入门第35节:Android中基于回调的事件处理 通过前面两期掌握了Android中基于监听的事件处理的五种形式,那么本期一起来学习Android中基于回调的事件处理. 一. ...

  3. Android的事件处理机制之基于监听的事件处理

    无论是桌面应用还是手机应用程序,面对用户的使用,经常需要处理的便是用户的各种动作,也就是需要为用户动作提供响应,这种为用户动作提供响应的机制就是事件处理. 而Android为我们提供了两套强大的响应机 ...

  4. 基于回调的事件处理——重写onTouchEvent方法响应触摸屏事件

    对于Android提供的事件处理模型,不难发现基于监听的事件处理模型具有更大的优势: 基于监听的事件模型分工更加明确,事件源.事件监听有两个类分开实现,因此具有更好的维护性. Android的事件处理 ...

  5. Android学习笔记基于回调的事件处理

    流程: 常见的回调方法: 代码示例: @Override public boolean onTouchEvent(MotionEvent event) { Toast.makeText(getAppl ...

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

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

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

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

  8. Android事件处理机制

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

  9. Android——基于监听器的事件处理(转)

    事件,我们并不陌生! 所有的基于UI的应用程序,事件都变得不可或缺!试想一下,如果我们做的程序单击按钮和其它控件都没有反应,那么就如同一个人在这个世界上听不到声音一样! Android为我们提供了两种 ...

随机推荐

  1. 第七届蓝桥杯javaB组真题解析-剪邮票(第七题)

    题目 /* 剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2.jpg],[图3.jpg]中,粉红色 ...

  2. Python 之并发编程之manager与进程池pool

    一.manager 常用的数据类型:dict list 能够实现进程之间的数据共享 进程之间如果同时修改一个数据,会导致数据冲突,因为并发的特征,导致数据更新不同步. def work(dic, lo ...

  3. selenium webdriver 定位元素 第一部分

    static final WebDriver driver = ExplorerBase.IESetting(); // 实例化一个浏览器对象 @Test //@Ignore public void ...

  4. ZOJ4103 Traveler(2019浙江省赛)

    构造+思维~ #include<bits/stdc++.h> using namespace std; ; int N,M,T; int visit[maxn]; stack<int ...

  5. Java基础知识笔记第五章:子类与继承

    子类与父类 子类 class 子类名 extends 父类名{ ....... } 类的树形结构 子类的继承性 子类和父类在同一包中的继承性 子类继承了父类不是private的成员属性和成员方法   ...

  6. FormsAuthentication.HashPasswordForStoringInConfigFile方法再.net core中的替代代码

    FormsAuthentication.HashPasswordForStoringInConfigFile()这个加密方法再.net core中不存在了,可以用下面的方式达到一样的加密效果 usin ...

  7. development tool

    Eclipse :        https://www.eclipse.org/downloads/ WebStorm:   http://www.jetbrains.com/webstorm/do ...

  8. Python数据类型-4 列表

    列表 列表是Python中最基本也是最常用的数据结构之一.列表中的每个元素都被分配一个数字作为索引,用来表示该元素在列表内所排在的位置.第一个元素的索引是0,第二个索引是1,依此类推. Python的 ...

  9. swoole 监控文件改动

    <?php /** * 场景: * 进程监控文件改动 */ date_default_timezone_set('PRC'); echo '进程id:' . posix_getpid() . P ...

  10. 第3节 Scala中的模式匹配:1 - 5

    7.    模式匹配和样例类 Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句.类型检查等.并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配. 7.1 ...