Android按键事件处理过程详解

(2013-09-26 14:05:19)

标签:

it

在Android系统中,存在多种界面事件,如点击事件、触摸事件、焦点事件和菜单事件等,在这些界面事件发生时,Android界面框架调用界面控件的事件处理方法对事件进行处理。

Android系统界面事件的传递和处理遵循以下规则。

·如果界面控件设置了事件监听器,则事件将先传递给事件监听器。

·如果界面控件没有设置事件监听器,界面事件则会直接传递给界面控件的其他事件处理方法。

·即使界面控件设置了事件监听器,界面事件也可以再次传递给其他事件处理方法。

·是否继续传递事件给其他处理方法是由事件监听器处理方法的返回值决定的。

·如果监听器处理方法的返回值为true,表示该事件已经完成处理过程,不需要其他处理方法参与处理过程,这样事件就不会再继续进行传递。

·如果监听器处理方法的返回值为false,则表示该事件没有完成处理过程,或需要其他处理方法捕获到该事件,事件会被传递给其他的事件处理方法。

在MVC模型中,控制器根据界面事件(UI Event)类型不同,将事件传递给界面控件不同的事件处理方法。

·按键事件(KeyEvent)将传递给onKey()方法进行处理。

·触摸事件(TouchEvent)将传递给onTouch()方法进行处理。

下面以EditText控件中的按键事件为例,说明Android系统界面事件传递和处理过程。

设EditText控件已经设置了按键事件监听器,当用户按下键盘上的某个按键时,控制器将产生KeyEvent按键事件。Android系统会首先判断

EditText控件是否设置了按键事件监听器,因为EditText控件已经设置按键事件监听器OnKeyListener,所以按键事件先传递到监听

器的事件处理方法onKey()中,事件能够继续传递给EditText控件的其他事件处理方法,完全根据onKey()方法的返回值来确定:如果

onKey()方法返回false,事件将继续传递,这样EditText控件就可以捕获到该事件,将按键的内容显示在EditText控件中;如果

onKey()方法返回true,将阻止按键事件的继续传递,这样EditText控件就不能够捕获到按键事件,也就不能够将按键内容显示在

EditText控件中。

Android界面框架支持对按键事件的监听,并能够将按键事件的详细信息传递给处理方法。为了处理控件的按键事件,先需要设置按键事件的监听器,并重载onKey()方法,示例代码如代码清单1所示。

代码清单1 设置按键事件的监听器,并重载onKey()方法

entryText.setOnKeyListener(new OnKeyListener(){

@Override

public boolean onKey(View view, int keyCode, KeyEvent keyEvent)

{

//过程代码……

return true/false;

}

第1行代码是设置控件的按键事件监听器。

第3行代码的onKey

()方法中的参数:第1个参数View表示产生按键事件的界面控件;第2个参数keyCode表示按键代码;第3个参数KeyEvent则包含了事件的详细信息,如按键的重复次数、硬件编码和按键标志等。

第5行代码是onKey()方法的返回值:返回true,阻止事件传递;返回false,允许继续传递按键事件。

KeyEventDemo是一个说明如何处理按键事件的示例。

KeyEventDemo用户界面如图1所示。

图1 KeyEventDemo用户界面

图5-27中可以看出,最上方的EditText控件是输入字符的区域,中间的CheckBox控件用来控制onKey()方法的返回值,最下方的

TextView控件用来显示按键事件的详细信息,包括按键动作、按键代码、按键字符、UNICODE编码、重复次数、功能键状态、硬件编码和按键标志。

界面的XML文件的代码如代码清单2所示

代码清单2 界面XML文件

android:layout_width="match_parent"

android:layout_height="wrap_content">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="返回true,阻止将按键事件传递给界面元素" >

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="按键事件信息" >

在EditText中,当任何一个键按下或抬起时,都会引发按键事件。为了能够使EditText处理按键事件,需要使用setOnKeyListener

()方法在代码中设置按键事件监听器,并在onKey()方法中添加按键事件的处理过程,代码如代码清单3所示。

代码清单3 setOnKeyListener()

entryText.setOnKeyListener(new OnKeyListener(){

@Override

public boolean onKey(View view, int keyCode, KeyEvent keyEvent)

{

int metaState = keyEvent.getMetaState();

int unicodeChar = keyEvent.getUnicodeChar();

String msg = "";

msg +="按键动作:" + String.valueOf(keyEvent.getAction())+"\n";

msg +="按键代码:" + String.valueOf(keyCode)+"\n";

msg +="按键字符:" + (char)unicodeChar+"\n";

msg +="UNICODE:" + String.valueOf(unicodeChar)+"\n";

msg +="重复次数:"+

String.valueOf(keyEvent.getRepeatCount())+"\n";

msg +="功能键状态:" + String.valueOf(metaState)+"\n";

msg +="硬件编码:" + String.valueOf(keyEvent.getScanCode())+"\n";

msg +="按键标志:" + String.valueOf(keyEvent.getFlags())+"\n";

labelView.setText(msg);

if (checkBox.isChecked())

return true;

else

return false;

}

在上述代码中,第4行代码用来获取功能键状态。功能键包括左Alt键、右Alt键和Shift键,当这3个功能键被按下时,功能键代码metaState值分别为18、34和65;但没有功能键被按下时,功能键代码metaState值分别为0。

第5行代码获取了按键的Unicode值,而在第9行中,将Unicode转换为了字符,显示在TextView中。

第7行代码获取了按键动作,0表示按下按键,1表示抬起按键。第7行代码获取按键的重复次数,但当按键被长时间按下时,则会产生这个属性值。

第13行代码获取了按键的硬件编码,各硬件设备的按键硬件编码都不相同,因此该值一般用于调试。

第14行获取了按键事件的标志符。

分享:

喜欢

0

赠金笔

加载中,请稍候......

评论加载中,请稍候...

发评论

登录名: 密码: 找回密码 注册记住登录状态

昵   称:

评论并转载此博文

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

android 按键用户点击事件,Android按键事件处理过程详解相关推荐

  1. android四种点击事件,android点击事件的四种方式

    android点击事件的四种方式 第一种方式:创建内部类实现点击事件 代码如下: package com.example.dail; import android.text.TextUtils; im ...

  2. android自动屏幕点击事件,Android 中屏幕点击事件的实现

    在android下,事件的发生是在监听器下进行,android系统可以响应按键事件和触摸屏事件,事件说明如下: 常用实现OnClickListener,OnTouchListener,OnFocusC ...

  3. android html图片点击事件,Android TextView加载HTMl图文之添加点击事件和查看图片

    前言 用TextView显示Html图文,每一个需求都是需要探索的,不再是简单的添加点击事件就可以了. 1.如何添加点击事件 这里要使用上在Html.forHtml()方法中的第四个参数:Html.T ...

  4. android列表项点击事件,Android 开发 tips(2):监听 Listview 列表项点击事件

    Android 开发 tips(2):监听 Listview 列表项点击事件 (这篇和上篇本来是应该一起写的,但是太过冗长,附链接:[SimpleAdapter 在 Listview 中的应用] ht ...

  5. android通知栏的点击事件,Android监听消息通知栏点击事件

    Android监听消息通知栏点击事件 使用BroadCastReceiver 1 新建一个NotificationClickReceiver 类,并且在清单文件中注册!! public class N ...

  6. android studio listview点击事件,android如何响应listview上不同按钮点击事件

    参考来源:http://www.tuicool.com/articles/bamqiq 大致思路:重写适配器,让主函数继承接口接口 ListItemClickHelp,这个接口中包含onclick方法 ...

  7. android button自动点击事件,Android Button按钮的四种点击事件

    本文实例为大家分享了安卓Button按钮的四种点击事件,供大家参考,具体内容如下 第一种:内部类实现 1.xml里面先设置Button属性 android:id="+@id/button1& ...

  8. echarts中formatter修改鼠标悬浮事件信息操作、echarts地图块、散点区分触发点击事件 只触发散点问题详解

    这里写目录标题 1.实例 2.案例详解 1.实例 这次我拿echarts中 地图组合散点图的实例 !!!实现效果:滑到散点显示不同于地图块的信息 及 formatter 提示窗自定义!!! 这个显示项 ...

  9. android通知栏的点击事件,android自定义通知栏以及点击事件

    1 自定义一个方法弹出通知栏 private void notifyCust() { notId++; NotificationManager notificationManager = (Notif ...

最新文章

  1. 机器指令到汇编再到高级编程语言!
  2. 揭晓高速公路场景下计算机视觉与交通的秘密
  3. Java程序设计经典习题15道
  4. 全球数百万台 Mac 疑似因 Big Sur 更新险酿计算灾难,苹果官方回应来了!
  5. 教你几个写出原创文章的小方法
  6. Mysql字段数据类型:char与varchar的区别
  7. ROS:ubuntu-Ros使用OrbSLAM
  8. MongoDB身份验证
  9. html 地球大气,地球大气层为什么永远不会消失?
  10. python GIL 全局锁,多核cpu下的多线程性能究竟如何?
  11. [转] SQL Server中各个系统表的作用
  12. 解决ASP.NET2.0和1.1在同一台电脑上不能并行的问题(转)
  13. 数据结构(十七)数组和矩阵
  14. 【JAVA】第十一届蓝桥杯省模拟赛答案(高职专科组)
  15. 《公路测设技术》课程网课最新作业测验考试
  16. weblogic安装部署
  17. html 显示 16进制 颜色,16进制颜色(html颜色值)
  18. InnoDB如何实现事务特性
  19. Spring @Value 用法
  20. 无线认证web认证服务器,wifi web认证服务器地址

热门文章

  1. 水箱建模最小二乘法_大气VOCs在线监测系统评估工作指南(二)
  2. EFR32--如何在EFR32程序中修改UUID
  3. python win10 桌面_实战 | Python批量提取Win10锁屏壁纸
  4. 使用vscode 编辑运行processing代码
  5. 2021百度网盘网页版视频在线倍速播放
  6. 我觉得是全网最全最好最有用的sed命令详解+示例
  7. TIA西门子博途V17程序安装及相关注意事项
  8. 计算机房需要排风吗,机房新风排风系统怎么样 机房新风排风系统原理介绍【详解】...
  9. Parallels Desktop 安装Win 10提示“安全启动功能防止操作系统启动”该怎么解决?
  10. 【spring aop】连接点(Jointpoint)、切入点(Pointcut)、增强(Advice)、方面/切面(Aspect、Advisor)