分享

Android应用程序----界面事件(按键事件)

 松林园 2021-05-11

Android系统中,存在多种界面事件,如点击事件、触摸事件、焦点事件和菜单事件等等 

在这些界面事件发生时,Android界面框架调用界面控件的事件处理函数对事件进行处理


按键事件 

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

按键事件(KeyEvent)将传递给onKey()函数进行处理 

触摸事件(TouchEvent)将传递给onTouch()函数进行处理


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

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

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

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


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

是否继续传递事件给其他处理函数是由事件监听器处理函数的返回值决定的 

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

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


EditText控件中的按键事件为例,说明Android系统界面事件传递和处理过程,假设EditText控件已经设置了按键事件监听器 

当用户按下键盘上的某个按键时,控制器将产生KeyEvent按键事件 

Android系统会首先判断EditText控件是否设置了按键事件监听器,因为EditText控件已经设置按键事件监听器OnKeyListener,所以按键事件先传递到监听器的事件处理函数onKey()


事件能够继续传递给EditText控件的其他事件处理函数,完全根据onKey()函数的返回值来确定 

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

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


Android界面框架支持对按键事件的监听,并能够将按键事件的详细信息传递给处理函数 

为了处理控件的按键事件,先需要设置按键事件的监听器,并重载onKey()函数

示例代码如下


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

3行代码的onKey ()函数中的参数 

1个参数view表示产生按键事件的界面控件 

2个参数keyCode表示按键代码 

3个参数keyEvent则包含了事件的详细信息,如按键的重复次数、硬件编码和按键标志等 n5代码onKey ()函数的返回值

返回true,阻止事件传递 

返回false,允许继续传递按键事件


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

KeyEventDemo用户界面 

最上方的EditText控件是输入字符的区域 

中间的CheckBox控件用来控制onKey()函数的返回值 

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

界面的XML文件的代码如下


EditText中,每当任何一个键子按下或抬起时,都会引发按键事件 

为了能够使EditText处理按键事件,需要使用setOnKeyListener ()函数在代码中设置按键事件监听器,并在onKey()函数添加按键事件的处理过程


4行代码用来获取功能键状态。功能键包括左Alt键、右Alt键和Shift键,当这三个功能键被按下时,功能键代码metaState值分别为183465;但没有功能键被按下时,功能键代码metaState值分别为0 

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

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

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

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

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多