OnKeyListener接口简介
OnKeyListener是对手机键盘进行监听的接口,通过对某个View注册该监听,当View获得焦点并有键盘事件时,便会触发该接口中的回调方法。该接口中的抽象方法签名如下。
Java代码:- public boolean onKey(View v, int keyCode, KeyEvent event)
复制代码 参数v:参数v为事件的事件源控件。
参数keyCode:参数keyCode为手机键盘的键盘码。
参数event:参数event便为键盘事件封装类的对象,其中包含了事件的详细信息,例如发生的事件、事件的类型等。
接下来同样通过一个简单的案例来介绍该接口的使用方法,步骤如下。
效果图:
准备字符串资源。同样打开strings.xml文件,用下列代码替换其原有代码。
Java代码:
- <xml version="1.0" encoding="utf-8"?>
- <resources>
- <string name="textView">使用键盘中的ABCD键控制四个按钮 string>
- <string name="app_name">Sample<string>
- <resources>
复制代码 开发主逻辑代码,打开Sample.java文件,用下列代码替代其原有代码。
Java代码:
- package eoe.demo;
- //声明所在包
- import android.app.Activity;
- //引入相关类
- //该处省略了部分包的引入代码,读者可自行查阅随书光盘中的源代码
- import android.widget.TextView;
- //引入相关类
- public class Sample extends Activity implements OnKeyListener,OnClickListener{
- ImageButton[] imageButtons = new ImageButton[4];
- //声明按钮数组
- TextView myTextView;
- //声明TextView的引用
- @Override
- public void onCreate(Bundle savedInstanceState) {
- //重写的onCreate方法
- super.onCreate(savedInstanceState);
- this.setContentView(R.layout.main);
- //设置当前显示的用户界面
- myTextView = (TextView) this.findViewById(R.id.myTextView);
- //得到myTextView的引用
- imageButtons[0] = (ImageButton)this.findViewById(R.id.button01);
- //得到button01的引用
- imageButtons[1] = (ImageButton) this.findViewById(R.id.button02);
- //得到button02的引用
- imageButtons[2] = (ImageButton)this.findViewById(R.id.button03);
- //得到button03的引用
- imageButtons[3] = (ImageButton)this.findViewById(R.id.button04);
- //得到button04的引用
- for(ImageButton imageButton : imageButtons){
- imageButton.setOnClickListener(this);
- //添加单击监听
- imageButton.setOnKeyListener(this);
- //添加键盘监听
- }
- }
- @Override
- public void onClick(View v) {
- //实现了接口中的方法
- if(v.getId() == R.id.button01){
- //改变的是button01时
- myTextView.setText("您点击了按钮A!");
- }
- else if(v.getId() == R.id.button02){
- //改变的是button02时
- myTextView.setText("您点击了按钮B");
- }
- else if(v.getId() == R.id.button03){
- //改变的是button03时
- myTextView.setText("您点击了按钮C");
- }
- else if(v.getId() == R.id.button04){
- //改变的是button04时
- myTextView.setText("您点击了按钮D");
- }
- else{
- //其他情况
- myTextView.setText("");
- }
- }
- @Override
- public boolean onKey(View v, int keyCode, KeyEvent event) {
- //键盘监听
- switch(keyCode){
- //判断键盘码
- case 29:
- //按键A
- imageButtons[0].performClick();
- //模拟单击
- imageButtons[0].requestFocus();
- //尝试使之获得焦点
- break;
- case 30:
- //按键B
- imageButtons[1].performClick();
- //模拟单击
- imageButtons[1].requestFocus();
- //尝试使之获得焦点
- break;
- case 31:
- //按键C
- imageButtons[2].performClick();
- //模拟单击
- imageButtons[2].requestFocus();
- //尝试使之获得焦点
- break;
- case 32:
- //按键D
- imageButtons[3].performClick();
- //模拟单击
- imageButtons[3].requestFocus();
- //尝试使之获得焦点
- break;
- }
- return false;
- }
- }
复制代码 第6~7行声明TextView的引用并创建按钮数组。
第9~21行重写了Activity的onCreate方法,在该方法中先设置当前的用户界面,然后得到各个控件的引用并为各个控件添加监听。
第22~35行实现了接口中的onClick方法,在方法中,根据事件源的ID判断是哪个按钮被按下,然后设置myTextView的文字。
第36~57行实现了接口中的onKey方法,在方法中,根据键盘码的不同执行不同的代码,当A键被按下时,模拟点击一下按钮0(第40行),在后尝试使该按钮获得焦点(第41行)。其他按键被按下时处理方法相同。
此时运行该案例,观察效果如图7-13所示,当点击手机键盘上的A、B、C、D键时,相当于点击ABCD按钮。