按键KEYCODE
1、onKey
OnKeyListener 监听接口,OnKeyListener只检测控制键,不会检测文本键(数字、字幕、标点等),实现onKey()方法:
private View.OnKeyListener mOnKeyListener = new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
return false;
}
};给指定的控件添加OnKeyListener
view.setOnKeyListener(mOnKeyListener );注意:
①返回true表示处理完,不再进行Key事件的分发。返回false,表示继续向后面处理,比如输入到EditText中。
②onKey()每次都会收到两次重复的按键编码,一次是KeyEvent.ACTION_DOWN,一次是KeyEvent.ACTION_UP,执行监听一个即可。
③onKey()方法能够同时检测硬件和软件按键事件。
④主页键KEYCODE_HOME、电源键KEYCODE_POWER、任务键KEYCODE_APP_SWITCH普通APP无法检测
应用举例:
软键盘搜索按钮按下自动收起输入法,移除EditText焦点,开始搜索。
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
//输入法按下回车键Enter
if (keyCode == KeyEvent.KEYCODE_ENTER) {
//通过InputMethodManager收起键盘
mInputMethodManager.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);
//移除EditText焦点
mEditText.clearFocus();
//后面可以进行其它业务,比如根据输入内容进行搜索等。
}
return true;
} else {
return false;
}
}
2、onKeyDown
除了给指定的控件添加监听OnKeyListener,还可以在活动页面Activity上进行监听拦截。
重写Activity的onKeyDown()方法,onKeyDown()只能检测4个物理按键:菜单键、返回键、音量+、音量-。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return super.onKeyDown(keyCode, event);
}注意:
①onKeyDown只能在Activity中使用,这个方法是Activity类继承KeyEvent中的KeyEvent.Callback回调接口
②onKeyDown顾名思义,没有两次重复的事件,只检测按下这个动作
③onKeyDown只能检测物理按键,不能像OnKeyListener那样检测输入法等软按键。
④返回true不再响应系统动作,截断本次KeyEvent。返回false继续响应系统动作
3、按键监听应用场景
用过很多应用,有些应用按两次返回键才能推出,第一次按返回键,会提示"再按一次返回键退出",这个是怎么做到的呢?就是利用了KeyEvent监听。
3.1、在onKeyDown()中处理
借助一个全局变量记录按下的时刻
//个人观点,时间在1.5s体验比较好
private static final long TIME_GAPS = 1500;
//记录上一次按返回键的时刻
private long mLastPressedBack = -1;在onKeyDown处理活动页面的返回按键事件:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (mLastPressedBack + TIME_GAPS <= System.currentTimeMillis()) {
mLastPressedBack = System.currentTimeMillis();
Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show();
} else {
finish();
}
}
return true;
}3.2、onBackPressed()
除了在onKeyDown()中处理,还可以在onBackPressed()中专门用来处理返回键按下的逻辑。看看在父类Activity中的原始定义:
/**
*当活动检测到用户按下返回键时调用。
*默认实现只是finish当前活动,
*可以覆盖此设置以执行所需的任何操作。
*/可以在这里完成上面的逻辑,不用单独监听返回按键。当返回按键按下时自动调用:
@Override
public void onBackPressed() {
if (mLastPressedBack + TIME_GAPS <= System.currentTimeMillis()) {
mLastPressedBack = System.currentTimeMillis();
Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show();
} else {
finish();
}
}3.2.1、onBackPressed()拓展
有一些应用按下返回键并不会退出,而是退到后台。通过任务管理器或者再次点击APP可以继续使用,而不是重新打开。也可以在onBackPressed()中添加这个逻辑,很简单,一句话,将Task移至后台:
@Override
public void onBackPressed() {
moveTaskToBack(true);
}moveTaskToBack(true)将任务移至后台,而不是默认的实现直接finish掉当前Activity。
推荐博客:

