Android事件监听器和回调方法

2023-11-04

事件是 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 中(网址:http://c.biancheng.net/view/3035.html),创建上下文菜单使用的是 registerForContextMenu(View v)方法,其本质是为 View 组件 v 注册该接口,并实现了相应的回调方法。

回调事件响应

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

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

名称 说明/作用 调用时间 参数说明 返回值说明
public boolean onKeyDown(int keyCode, KeyEvent event) 接口 KeyEvent.Callback 中的抽象方法 键盘按键被按下时由系统调用

keyCode 即键盘码,系统根据键盘码得知按下的是哪个按钮。

event为按钮事件的对象,包含触发事件的详细信息。例如事件的类型、状态等

true 已完成处理此事件
false 表示该事件还可以被其他监听器处理
public boolean onKeyUp(int keyCode, KeyEvent event) 接口 KeyEvent.Callback中的抽象方法 按钮向上弹起时被调用

keyCode 即键盘码,系统根据键盘码得知按下的是哪个按钮。

event为按钮事件的对象,包含触发事件的详细信息。例如事件的类型、状态等

true 代表已完成处理此事件
false 表示该事件还可以被其他监听器处理
public boolean onTouchEvent(MotionEvent event) 方法在 View 中定义 用户触摸屏幕时被自动调用 event 为触摸事件封装类的对象,封装了该事件的相关信息
 

当用户触摸到屏幕,屏幕被按下时,MotionEvent.getAction()的值为 MotionEvent.ACTION_ DOWN;

 

当用户将触控物体离开屏幕时,MotionEvent.getAction() 的值为 MotionEvent.ACTION_UP;

 

当触控物体在屏幕上滑动时,MotionEvent.getAction() 的值为 MotionEvent.ACTION_MOVE。

true 表示事件处理完成
false 表示未完成
public boolean onTrackballEvent(MotionEvent event) 处理手机中轨迹球的相关事件。
在 Activity 中重写,也可以在 View 中重写
  event 为手机轨迹球事件封装类的对象。 true 表示事件处理完成
false 表示未完成
protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) 只能在 View 中重写,当 View 组件焦点改变时被自动调用   gainFocus 表示触发该事件的 View 是否获得了焦点,获得焦点为 true。
参数 direction 表示焦点移动的方向。
参数 previouslyFocusedRect 是在触发事件的 View 的坐标系中前一个获得焦点的矩形区域

界面事件响应实例

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

接下来我们将通过一个实例来演示回调事件响应的处理过程,该实例 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.  
  7. <TextView
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:text="回调事件处理演示" />
  11.  
  12.     <LinearLayout
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:orientation="horizontal">
  16.  
  17.         <Button
  18. android:id="@+id/button1"
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:focusableInTouchMode="true"
  22. android:text="按钮1" />
  23.  
  24.         <Button
  25. android:id="@+id/button2"
  26. android:layout_width="wrap_content"
  27. android:layout_height="wrap_content"
  28. android:focusableInTouchMode="true"
  29. android:text="按钮2" />
  30.  
  31.         <Button
  32. android:id="@+id/button3"
  33. android:layout_width="wrap_content"
  34. android:layout_height="wrap_content"
  35. android:focusableInTouchMode="true"
  36. android:text="按钮3" />
  37.     </LinearLayout>
  38. </LinearLayout>

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

Activity EventDemo捕获事件
图 2  Activity EventDemo捕获事件

EventDemo.java代码如下:

纯文本复制
 
  1. package introduction.android.notidemo;
  2.  
  3. import android.app.Activity;
  4. import android.content.Context;
  5. import android.graphics.Rect;
  6. import android.os.Bundle;
  7. import android.util.Log;
  8. import android.view.KeyEvent;
  9. import android.view.MotionEvent;
  10. import android.view.View;
  11.  
  12. import android.view.View.OnFocusChangeListener;
  13. import android.widget.Button;
  14. import android.widget.Toast;
  15.  
  16. public class MainActivity extends Activity implements OnFocusChangeListener {
  17. Button[] buttons = new Button[3];
  18.  
  19. @Override
  20. public void onCreate(Bundle savedInstanceState) {
  21. super.onCreate(savedInstanceState);
  22. setContentView(R.layout.activity_main);
  23.  
  24. buttons[0] = (Button) findViewById(R.id.button1);
  25. buttons[1] = (Button) findViewById(R.id.button2);
  26. buttons[2] = (Button) findViewById(R.id.button3);
  27. for (Button button : buttons) {
  28. button.setOnFocusChangeListener(this);
  29. }
  30. }
  31.  
  32. //按钮按下触发的事件
  33. public boolean onKeyDown(int keyCode, KeyEvent event) {
  34. switch (keyCode) {
  35.  
  36. case KeyEvent.KEYCODE_DPAD_UP:
  37. DisplayInformation("按上下方向键,KEYCODE_DPAD_UP");
  38. break;
  39. case KeyEvent.KEYCODE_DPAD_DOWN:
  40. DisplayInformation("按上下方向键,KEYCODE__DPAD_UP");
  41. break;
  42. }
  43. return false;
  44. }
  45.  
  46. //按钮弹起触发的案件
  47. public boolean onKeyUp(int keyCode, KeyEvent event) {
  48. switch (keyCode) {
  49.  
  50. case KeyEvent.KEYCODE_DPAD_UP:
  51. DisplayInformation("松开上方向键,KEYCODE_DPAD_UP");
  52. break;
  53. case KeyEvent.KEYCODE_DPAD_DOWN:
  54. DisplayInformation("松开下方向键,KEYCODE_DPAD_UP");
  55. break;
  56. }
  57. return false;
  58. }
  59.  
  60. //触摸事件
  61. public boolean onTouchEvent(MotionEvent event) {
  62. switch (event.getAction()) {
  63. case MotionEvent.ACTION_DOWN:
  64. DisplayInformation("手指正在往屏幕上按下");
  65. break;
  66.  
  67. case MotionEvent.ACTION_MOVE:
  68. DisplayInformation("手指正在往屏幕上移动");
  69. break;
  70. case MotionEvent.ACTION_UP:
  71. DisplayInformation("手指正在往屏幕上按抬起");
  72. break;
  73. }
  74. return false;
  75.  
  76. }
  77.  
  78. //焦点事件
  79. @Override
  80. public void onFocusChange(View view, boolean arg1) {
  81. switch (view.getId()) {
  82. case R.id.button1:
  83. DisplayInformation("第一个按钮获得了焦点");
  84. break;
  85. case R.id.button2:
  86. DisplayInformation("第二个按钮获得了焦点");
  87. break;
  88. case R.id.button3:
  89. DisplayInformation("第三个按钮获得了焦点");
  90. break;
  91. }
  92. }
  93.  
  94. //显示Toast
  95. public void DisplayInformation(String string) {
  96. //Toast.makeText (EventDemo.this,string,Toast.LENGTH_SHORT).show();
  97. Log.i("enentDemo", string);
  98. }
  99. }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android事件监听器和回调方法 的相关文章

  • 调整 Android 日期选择器控件的大小

    如何将 android datepicker 控件的初始大小调整为更小或更大 有没有唯一的方法可以重新实现它 我一直无法找到调整其大小的方法 但已经看到了使用 DatePicker 作为对话框的实现 日期呈现为带有编辑按钮的 TextVie
  • 使用JACK时生成的proguard mappings.txt文件在哪里?

    我一直在尝试使用最新的JACK 和 JILL 构建系统到我的android项目 我知道JACK进程包括proguard处理 但之后我找不到映射 txt归档回溯堆栈跟踪Google Play 开发者控制台上提供的错误数 请帮我查找映射 txt
  • Android 中的振动器

    如何创建Vibrator对象并调用vibrate函数 http developer android com reference android os Vibrator html http developer android com refe
  • 运行低于 Lollipop 的设备上的 CameraManager

    我遇到一个问题 我同时使用 Camera 低于 Lollipop 设备 和 CameraManager 类 Lollipop 及以上设备 运行低于 Lollipop 的设备会崩溃 我相信这是因为 import android hardwar
  • 在 Mac 上升级到 Android Studio 3.3 后,运行卡在“安装 APK”上并且无法部署到连接的设备

    从 Mac 机器上的稳定通道升级到最新的 Android Studio 版本 3 3 后 现在当我使用连接的设备按下运行时 它会成功构建并不断告诉 正在安装 apk 但经过一段时间后 它既不安装也不显示错误 也尝试过模拟器和同样的问题 任何
  • 如何避免 Android 游戏中的时钟漏洞?

    我需要测量一段可以持续几个小时的时间 我假设执行此操作的正常方法是这样的 Date date new Date wait some time new Date getTime date getTime 但是用户是否可以将 Android 的
  • MLKit Firebase android - 如何将 FirebaseVisionFace 转换为图像对象(如位图)?

    我已将 MLkit FaceDetection 集成到我的 Android 应用程序中 我已参考以下网址 https firebase google com docs ml kit android detect faces https fi
  • 向 Android 操作栏添加按钮

    我如何制作带有文本的按钮 在操作栏中带有图像 如下所示 是否可以使用内置的 android 按钮或图像按钮在操作栏中执行如下操作 我正在使用 appcompat 来使用操作栏 是的 如果需要 您可以膨胀自定义操作栏 Override pro
  • 如何让按钮的角变圆?

    我想制作一个角button圆形的 在 Android 中是否有一种简单的方法可以实现这一点 如果你想要这样的东西 这是代码 1 在您的可绘制文件夹中创建一个 xml 文件 如 mybutton xml 并粘贴以下标记
  • Gradle 构建失败 - 无法解压

    我正在使用 android studio 做一个项目 最近它显示了一个错误your SDK is missing or out of date所以 我再次下载了SDK 现在它显示一个错误 Gradle Build failed 错误如下 E
  • 使用 Android 解析 JSON 的最有效方法

    我编写了一些代码来解析我的 Android 程序收到的 Google 距离矩阵 JSON 响应 我唯一感兴趣的数据是 距离 值 节点 我的代码可以工作 但似乎必须有一种更简单的方法来做到这一点 距离值节点在 JSON 中嵌套得很深 但是真的
  • 在Android上使用XStream时如何注释order字段?

    我需要从 Android 上的 java 对象生成 XML XML 节点必须位于 确定的顺序 这是我得到的 这些字段按字母顺序排列
  • 无法将库添加到我的 Android 项目

    我正在创建一个新应用程序 我想使用一些像这样的库 https github com JakeWharton Android ViewPagerIndicator https github com JakeWharton Android Vi
  • 在 Android 中将图像从可绘制图像转换为字节数组

    由于我要将图像发送到 Parse com 因此我必须将其转换为字节数组 我的第一种方法是从图库中选择图像并将其转换为字节数组 如下所示 Override protected void onActivityResult int request
  • @android的含义

    我想问一下是什么意思 android as in android id android id list 我在不同的 android 示例和教程中看到过它 我也用谷歌搜索过它 我发现的唯一解释是 列表和空 ID 是由 Android 平台为我
  • Android Studio安装JDK错误

    In Android Studio I am facing bellow error 当我按下时会显示此弹出窗口Alt Enter对于缺少的类 符号 当我点击 setup SDK 时 它显示两个选项 1 8 Java版本 1 8 0 60
  • 清单合并失败:需要为 显式指定 android:exported

    我的清单文件有问题 错误消息 清单合并失败 android 需要为 明确指定导出 面向 Android 12 及更高版本的应用需要指定显式值android exported当相应的组件定义了意图过滤器时 有关详细信息 请参阅 https d
  • 选择活动时运行时崩溃

    首先我想说我几乎没有 Android 经验 这是我在 Android 中的第一个项目 而且我的老师不太擅长教学 所以我对任何过度的无知表示歉意 在进一步讨论之前先解释一下 我的应用程序的目标本质上是能够记录您在某些活动上花费了多少时间 记录
  • RecyclerView 来自 Firebase 的部分和数据

    您好 我正在开发一个应用程序 在其中我必须使用 Firebase 填充数据回收器视图 准备就绪 现在我想做的是用 data firebase 填写一个 recyclerview 但有一些部分将成为托管 data firebase 的父级 我
  • 在 Android(JB 上)中,如何向自定义丰富通知添加操作?

    我一直在使用 Jelly Bean 中新的丰富通知 当我使用模板设置新通知时 一切都按预期工作Notification BigPictureStyle Notification BigTextStyle or Notification In

随机推荐

  • 用html+js实现代码背景墙特效【建议收藏】

    在csdn里面 有些博主的主页非常的帅 就是代码从上往下掉的特效 那么这种效果我们作为程序员该如何去写出来呢 不用担心 这篇博客就分享如何创建一个代码背景墙 1 效果展示 2 代码分享
  • java.io.FileNotFoundException: http://www.xxxxx.net:8080/test/test/ 403错误

    POST请求错误内容 java io FileNotFoundException http www xxxxx net 8080 test test at libcore net http HttpURLConnectionImpl get
  • python 中的六种“复制”方法

    以列表为例 方法一 直接变量赋值 将 li 赋值给变量 li1 打印他们的id会发现 他们的id是一样的 即是 li 和 li1 这两个变量在python中是同一个内存地址 对他们任何一个变量进行修改 另外一个会跟着变化 li 1 2 3
  • arm体系结构概述和编程模型

    1 arm体系结构的版本 1 arm1 6 2 arm体系的变种 1 T 系列 Thumb指令集 可以支持Thumb指令集 2 M系列 支持长乘法 32位 32位生成64位数据 长乘加指令 再加上32位数据 3 E系列 增强型DSP指令 增
  • 【Go语言(golang)教程】A Tour of Go 七十集大全

    http www aqee net go a tour of go 5 Go语言 golang 教程 A Tour of Go 1 Hello World Go语言 golang 教程 A Tour of Go 2 安装离线练习器 Go语言
  • 数字电子钟 1Hz 秒脉冲信号的设计

    数字电子钟 1Hz 秒脉冲信号的设计 摘 要 要设计数字钟 首先应选择一个能产生稳定的标准时间脉冲信号 而脉冲源产生的脉冲信号的频率较高 因此 需要进行分频 使高频脉冲信号变成适合于计时的低频脉冲信号 即 秒脉冲信号 频率1HZ 1引言 数
  • 找出看了5个电影以上的用户

    问题 在1亿条用户记录里 如何快速查询统计出看了5个电影以上的用户 解答 分以下几个步骤完成 1 建立 hash map lt 用户 电影数 gt 2 顺序扫描1亿条用户记录 1 如果 用户 在hash map中不存在 则新增并设 电影数
  • IT项目管理之第5章 项目时间管理习题之案例分析汇总

    IT项目管理之第5章 项目时间管理习题之案例分析汇总 项目时间管理习题之案例分析汇总 案例1 案例分析 案例1参考答案 案例2 案例2分析 案例2参考答案 叮嘟 这里是小啊呜的学习课程资料整理 好记性不如烂笔头 今天也是努力进步的一天 一起
  • DevopsCamp 第 2 期作业: 《cobra - 05 Go 项目的目录结构》

    DevopsCamp 第 2 期作业 cobra 05 Go 项目的目录结构 原文链接 https typonotes com posts 2023 02 13 devopscamp cobra 05 layout Go 项目的目录结构 G
  • windows server 2016搭建AD域

    此实验以windows sever 2016为例 安装windows server 2016 操作省略 一台服务器想要安装成AD DC 活动目录域服务 必须具备以下条件 安装者必须具有本地管理员权限 DNS基础结构的支持 可以在安装AD D
  • 电脑开机出现黑屏,出现“windows 未能启动,原因可能更改了硬件或者软件,解决此类问题的步骤”

    出现问题的界面如下 解决此类问题的步骤如下 1 直接按 enter 回车键 2 出现以下界面 我自己的是windows 10系统哈 因为当时没保存自己的照片 只能拿这个顶替一下 但是步骤是一样的 3 然后按提示按F8 正常来说时会出现以下的
  • Python高级函数2:使用itertools、functools、operator使得代码更高效、可读、可重用

    Python高级函数2 使用itertools functools operator使得代码更高效 可读 可重用 1 原理 itertools groupby functools partial operator attrgetter 和
  • python生成gif(图片渐变)

    show you the code 后面还需要完善图片分辨率的处理 这样就比较好了 目前分辨率没有进行处理 import os import imageio from PIL import Image from images2gif imp
  • 【python】IPython的使用技巧整理

    IPython是一种基于Python的交互式解释器 提供了强大的编辑和交互功能 IPython拥有 满足你各种需求的交互式shell 火爆数据科学社区的Jupyter内核 供Jupyter Notebook使用 对交互式数据可视化和GUI工
  • Cocos2d-X3.0版的HelloWorld工程分析

    打开上一篇博客中的HelloWorld工程后 会看到下图所示的工程文件 main cpp文件中的代码 本人已经注释 1 2 3 4 5 6 7 8 9
  • MATLAB2016笔记(十):曲线拟合、参数估计

    文章目录 一 曲线拟合函数 一 概述 二 多项式拟合 polyfit 三 加权最小方差 WLS 拟合 自行编写polyfits 四 非线性曲线拟合 lsqcurvefit 二 参数估计函数 一 常见分布的参数分布 二 点估计 最大似然估计
  • Puppeteer入门初探

    本文来自网易云社区 作者 唐钊 最近在看 node 爬虫相关的一些东西 我记得还是很久以前常用的 node 爬虫工具还是 superagengt cherrio 他们的思路是通过发起 http 请求然后截取 respone 的内容 但是随着
  • Vue集成百度的Ueditor 前端+后台

    1 vue安装命令 npm i vue ueditor wrap 2 下载插件 Ueditor官网地址为 Ueditor 3 插件位置 下载好之后 将Jsp版本解压 解压后文件夹改名为UEditor 将文件夹中的 jsp目录删掉 将UEdi
  • 【编程笔试】美团2021校招笔试-通用编程题第2场(附思路及C++代码)

    导览 练习地址 小团的配送团队 不一样的逆序数 小团的旅行路线 小团的车辆调度 总结 练习地址 点此前往练习 小团的配送团队 小团是美团外卖的区域配送负责人 众所周知 外卖小哥一般都会同时配送若干单 小团在接单时希望把同一个小区的单子放在一
  • Android事件监听器和回调方法

    事件是 Android 平台与用户交互的手段 当用户对手机进行操作时 会产生各种各样的输入事件 Android 框架捕获到这些事件 进而进行处理 Android 平台提供了多种用于获取用户输入事件的方式 考虑到用户事件都是在特定的用户界面中