您好!欢迎来到源码码网!

Android事件监听器和回调方法详解

  • 源码教程
  • 来源:源码码网
  • 编辑:admin
  • 时间:2021-01-12 21:23
  • 阅读:1024

事件是 Android 平台与用户交互的手段。当用户对手机进行操作时,会产生各种各样的输入事件,Android 框架捕获到这些事件,进而进行处理。

Android平台提供了多种用于获取用户输入事件的方式,考虑到用户事件都是在特定的用户界面中产生的,因此 Android 选用特定 View 组件来获取用户输入事件的方式,由 View 组件提供事件的处理方法。这就是为什么 View 类内部带有处理特定事件的监听器。

事件监听器

监听器用于对特定事件进行监听,一旦监听到特定事件,则由监听器截获该事件,并回调自身的特定方法对事件进行处理。

在教程之前的实例中,我们使用的事件处理方式都是监听器。根据用户输入方式的不同,View 组件将截获的事件分为 6 种,对应以下 6 种事件监听器接口。

1) OnClickListener 接口

此接口处理的是单击事件,例如,在 View 上进行单击动作,在 View 获得焦点的情况下单击“确定”按钮或者单击轨迹球都会触发该事件。

当单击事件发生时,OnClickListener 接口会回调 public void onClick(View v) 方法对事件进行处理。其中参数 v 指的是发生单击事件的 View 组件。

2) OnLongClickListener 接口

此接口处理的是长按事件,当长时间按住某个 View 组件时触发该事件。

其对应的回调方法为 public boolean onLongClick(View v),当返回 true 时,表示已经处理完此事件,若事件未处理完,则返回 false,该事件还可以继续被其他监听器捕获并处理。

3) OnFocusChangeListener 接口

此接口用于处理 View 组件焦点改变事件。当 View 组件失去或获得焦点时会触发该事件。

其对应的回调方法为 public void onFocusChange(View v, Boolean hasFocus),其中参数 v 表示产生事件的事件源,hasFocus 表示事件源的状态,即是否获得焦点。

4) OnKeyListener 接口

此接口用于对手机键盘事件进行监听,当View获得焦点并且键盘被敲击时会触发该事件。

其对应的回调方法为 public boolean onKey(View v, int keyCode, KeyEvent event)。

方法参数说明:

  • keyCode 为键盘码。

  • event 为键盘事件封装类的对象。

5) OnTouchListener 接口

此接口用来处理手机屏幕事件,当在 View 的范围内有触摸、按下、抬起、滑动等动作时都会触发该事件,并触发该接口中的回调方法。

其对应的回调方法为 public boolean onTouch(View v, MotionEvent event),对应的参数同上。

6) OnCreateContextMenuListener 接口

此接口用于处理上下文菜单被创建的事件。

其对应的回调方法为 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo info),其中参数 menu 为事件的上下文菜单,参数 info 是该对象中封装了有关上下文菜单的其他信息。

在之前Android菜单教程实例 MenusDemo 中(网址:
https://www.ymama.net/news/txtlist_i655v.html),创建上下文菜单使用的是 registerForContextMenu(View v)方法,其本质是为 View 组件 v 注册该接口,并实现了相应的回调方法。

回调事件响应

在 Android 框架中,除了可以使用监听器进行事件处理之外,还可以通过回调机制进行事件处理。

Android SDK 为 View 组件提供了 5 个默认的回调方法,如果某个事件没有被任意一个 View 处理,就会在 Activity 中调用响应的回调方法,这些方法分别说明如下。

image.png

image.png

界面事件响应实例

在之前的教程中,多次使用监听器对事件进行处理,应该此已经很熟悉了。

接下来我们将通过一个实例来演示回调事件响应的处理过程,该实例 EventDemo 的运行效果如图 1 所示。

实例EventDemo的运行效果

图 1  实例EventDemo的运行效果

其布局文件 main.xml 内容如下:

  1. <?xml version="l.0" encoding="utf-8"?>

  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

  3. android:layout_width="fill_parent"

  4. android:layout_height="fill_parent"

  5. android:orientation="vertical">


  6. <TextView

  7. android:layout_width="fill_parent"

  8. android:layout_height="wrap_content"

  9. android:text="回调事件处理演示" />


  10.     <LinearLayout

  11.            android:layout_width="wrap_content"

  12.            android:layout_height="wrap_content"

  13.            android:orientation="horizontal">


  14.     <Button

  15.           android:id="@+id/button1"

  16.           android:layout_width="wrap_content"

  17.           android:layout_height="wrap_content"

  18.           android:focusableInTouchMode="true"

  19.           android:text="按钮1" />


  20.     <Button

  21.            android:id="@+id/button2"

  22.            android:layout_width="wrap_content"

  23.            android:layout_height="wrap_content"

  24.            android:focusableInTouchMode="true"

  25.            android:text="按钮2" />


  26.     <Button

  27.            android:id="@+id/button3"

  28.            android:layout_width="wrap_content"

  29.            android:layout_height="wrap_content"

  30.            android:focusableInTouchMode="true"

  31.            android:text="按钮3" />

  32.     </LinearLayout>

  33. </LinearLayout>

当用户在屏幕上做移动触摸、单击按钮等操作时,主 Activity MainActivity 会捕获相应事件并进行处理,在 LogCat 中打印相关内容,运行效果如图 2 所示。

Activity EventDemo捕获事件

图 2  Activity EventDemo捕获事件

EventDemo.java代码如下:

  1. package introduction.android.notidemo;


  2. import android.app.Activity;

  3. import android.content.Context;

  4. import android.graphics.Rect;

  5. import android.os.Bundle;

  6. import android.util.Log;

  7. import android.view.KeyEvent;

  8. import android.view.MotionEvent;

  9. import android.view.View;


  10. import android.view.View.OnFocusChangeListener;

  11. import android.widget.Button;

  12. import android.widget.Toast;


  13. public class MainActivity extends Activity implements OnFocusChangeListener {

  14. Button[] buttons = new Button[3];


  15. @Override

  16. public void onCreate(Bundle savedInstanceState) {

  17. super.onCreate(savedInstanceState);

  18. setContentView(R.layout.activity_main);


  19. buttons[0] = (Button) findViewById(R.id.button1);

  20. buttons[1] = (Button) findViewById(R.id.button2);

  21. buttons[2] = (Button) findViewById(R.id.button3);

  22. for (Button button : buttons) {

  23. button.setOnFocusChangeListener(this);

  24. }

  25. }


  26. //按钮按下触发的事件

  27. public boolean onKeyDown(int keyCode, KeyEvent event) {

  28. switch (keyCode) {


  29. case KeyEvent.KEYCODE_DPAD_UP:

  30. DisplayInformation("按上下方向键,KEYCODE_DPAD_UP");

  31. break;

  32. case KeyEvent.KEYCODE_DPAD_DOWN:

  33. DisplayInformation("按上下方向键,KEYCODE__DPAD_UP");

  34. break;

  35. }

  36. return false;

  37. }


  38. //按钮弹起触发的案件

  39. public boolean onKeyUp(int keyCode, KeyEvent event) {

  40. switch (keyCode) {


  41. case KeyEvent.KEYCODE_DPAD_UP:

  42. DisplayInformation("松开上方向键,KEYCODE_DPAD_UP");

  43. break;

  44. case KeyEvent.KEYCODE_DPAD_DOWN:

  45. DisplayInformation("松开下方向键,KEYCODE_DPAD_UP");

  46. break;

  47. }

  48. return false;

  49. }


  50. //触摸事件

  51. public boolean onTouchEvent(MotionEvent event) {

  52. switch (event.getAction()) {

  53. case MotionEvent.ACTION_DOWN:

  54. DisplayInformation("手指正在往屏幕上按下");

  55. break;


  56. case MotionEvent.ACTION_MOVE:

  57. DisplayInformation("手指正在往屏幕上移动");

  58. break;

  59. case MotionEvent.ACTION_UP:

  60. DisplayInformation("手指正在往屏幕上按抬起");

  61. break;

  62. }

  63. return false;


  64. }


  65. //焦点事件

  66. @Override

  67. public void onFocusChange(View view, boolean arg1) {

  68. switch (view.getId()) {

  69. case R.id.button1:

  70. DisplayInformation("第一个按钮获得了焦点");

  71. break;

  72. case R.id.button2:

  73. DisplayInformation("第二个按钮获得了焦点");

  74. break;

  75. case R.id.button3:

  76. DisplayInformation("第三个按钮获得了焦点");

  77. break;

  78. }

  79. }


  80. //显示Toast

  81. public void DisplayInformation(String string) {

  82. //Toast.makeText (EventDemo.this,string,Toast.LENGTH_SHORT).show();

  83. Log.i("enentDemo", string);

  84. }

  85. }


特别声明:
1、如无特殊说明,内容均为本站原创发布,转载请注明出处;
2、部分转载文章已注明出处,转载目的为学习和交流,如有侵犯,请联系客服删除;
3、编辑非《源码码网》的文章均由用户编辑发布,不代表本站立场,如涉及侵犯,请联系删除;
全部评论(0)
推荐阅读
  • 陀螺匠OA办公系统源码 PHP + Vue 前后端分离 完整可商用
  • 陀螺匠OA办公系统源码 PHP + Vue 前后端分离 完整可商用
  • 项目介绍《陀螺匠》是一套采用Laravel9框架结合Swoole高性能框架与Vue.js前端技术栈构建的AI+低代码双引擎智能办公系统。陀螺匠深度融合了AI智能体以及低代码开发平台,系统简约,易于功能扩展,方便二次开发。旨在为企业提供一站式、数智化转型的全方位解决方案,助力企业高效运营与智能决策。源码说明源码说明:项目代码100%开源,基于AGPL-3.0,支持免费商用!技术栈:系统基于Laravel9+Swoole+Vue.
  • 软件教程
  • 来源:CRMEB
  • 编辑:CRMEB
  • 时间:2026-03-27 15:33
  • 阅读:651
  • open claw最近很火,如何理性看待?
  • open claw最近很火,如何理性看待?
  • openclaw是2026年初科技圈最火爆的现象级话题。它不仅仅是又一个AI产品,更被百川智能的王小川誉为与ChatGPT诞生同等重要的里程碑——标志着AI从”只会说”的对话者,进化到了”能够做”的行动者。对于这股全民”养虾”热潮,我的观察是:它代表了一次人机关系的革命性跃迁,但同时也是一场充满风险与泡沫的狂欢,其真正的价值需要在喧嚣褪去、安全与成本的挑战被克服后才能显现。下
  • 行业资讯
  • 来源:源码码网
  • 编辑:源码码网
  • 时间:2026-03-17 11:06
  • 阅读:711
  • 原生小程序和封装的小程序有什么区别
  • 原生小程序和封装的小程序有什么区别
  • 原生小程序和封装的小程序是两种不同的开发模式,主要区别在于开发方式、性能表现、代码维护以及跨平台能力。为了让你更清晰地理解,我们可以把“原生”比作用钢筋水泥直接盖楼,而“封装”则是用预制板或套件来组装楼。以下是详细的对比分析:1.定义与本质原生小程序:定义: 直接使用微信官方提供的开发工具、语法和API进行开发。语言: 使用微信自己定义的一套技术栈(WXML(微信标记语言)做结构、WXSS(微信样式表)做样式、JS
  • 行业资讯
  • 来源:源码码网
  • 编辑:源码码网
  • 时间:2026-03-06 11:54
  • 阅读:941
  • 基于NetCore(Razor Page)开发的Cms建站系统MIT协议
  • 基于NetCore(Razor Page)开发的Cms建站系统MIT协议
  • FytSoaCms一款基于NetCore2.2/3.1(RazorPage)功能强大的Cms建站系统,支持前后端分离。简介:模块化:全新的架构和模块化的开发机制,便于灵活扩展和二次开发。模型/栏目/分类信息体系:通过栏目和模型绑定,以及不同的模型类型,不同栏目可以实现差异化的功能,轻松实现诸如资讯、下载、讨论和图片等功能。通过分类信息和栏目绑定,可以自动建立索引表,轻松实现复杂的信息检索。FytSoa是一套基于NetCore+SqlS
  • 开发工具
  • 来源:gitee
  • 编辑:源码码网
  • 时间:2026-01-24 22:21
  • 阅读:797
  • 基于JAVA开发的企业级平台微信公众号管理系统SmartWx
  • 基于JAVA开发的企业级平台微信公众号管理系统SmartWx
  • SmartWx微信公众号管理系统是一个完整的微信公众号web操作版,直接编译即可运行。让用户不再用关心微信的底层接口,直接使用页面进行操作,简单方便。包括服务器绑定、文本管理、图文管理、菜单管理、粉丝管理、群发消息等。技术框架开发语言:JAVA数据库:MYSQLJAVA开发框架:SpringMVC+Spring+Mybatis缓存框架:j2cache前端开发框架:Layui+JQuery+html前台模板引擎:art-templat
  • 源码教程
  • 来源:gitee
  • 编辑:源码码网
  • 时间:2026-01-24 21:53
  • 阅读:829
联系客服
源码代售 源码咨询 技术开发 联系客服
029-84538663
手机版

扫一扫进手机版
返回顶部