在 Android 中实现返回键的监听,只要两种方式:
-
方式 1 :监听返回键;
@Override public void onBackPressed() { super.onBackPressed(); } 复制代码
-
方式 2 :重写 keyDown() 方法,监听 KeyEvent 事件 ;
//重写 keydown 事件 public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if ((System.currentTimeMillis() - mkeyTime) > 2000) { // 退出操作 } } } 复制代码
但是,在 Android studio 打开 Cocos2dx 游戏的 studio 版本后,无路是方式 1 还是方式 2 都无法监听到返回键的操作。
原因是因为在 Cocos2dx 下的 GLSurfaceView 类中,实现了 keyDown() 方法,导致事件在上层已经被处理掉了。
GLSurfaceView.java
@Override
public boolean onKeyDown(final int pKeyCode, final KeyEvent pKeyEvent) {
switch (pKeyCode) {
case KeyEvent.KEYCODE_BACK:
Cocos2dxVideoHelper.mVideoHandler.sendEmptyMessage(Cocos2dxVideoHelper.KeyEventBack);
....// 其他省略
default:
return super.onKeyDown(pKeyCode, pKeyEvent);
}
}
复制代码
在官方 API 中关于 keyDown() 的描述是 :
public boolean onKeyDown (int keyCode, KeyEvent event)
Called when a key was pressed down and not handled by any of the views inside of the activity. So, for example, key presses while the cursor is inside a TextView will not trigger the event (unless it is a navigation to another object) because TextView handles its own key presses.
If the focused view didn't want this event, this method is called.
标记部分的文字翻译的意思是:当用户按下一个按键的时候调用,但是前提是这个事件没有被其他的任何 views 监听并处理。
因为在 Cocos2dx 中的 GLSurfaceView 实现了 keyDown() 方法,处理了事件,所以我们的监听事件获取不到事件的返回值。
如何让我们的监听可以获取到事件呢?很简单,只需要在 GLSurfaceView 的 keyDown() 方法中,在监听到KeyEvent.KEYCODE_BACK 时,不作处理即可(return false).
改为如下代码 :
@Override
public boolean onKeyDown(final int pKeyCode, final KeyEvent pKeyEvent) {
switch (pKeyCode) {
case KeyEvent.KEYCODE_BACK:
Cocos2dxVideoHelper.mVideoHandler.sendEmptyMessage(Cocos2dxVideoHelper.KeyEventBack);
return false;
....// 其他省略
default:
return super.onKeyDown(pKeyCode, pKeyEvent);
}
}
复制代码
这样之后,在 Cocos2dx 下的 AppActivity 中就可以监听到返回键了,重写 keyDown() 方法。
private long mkeyTime = 0;
/**
* 监听Back键按下事件
* 注意:
* 返回值表示:是否能完全处理该事件
* 在此处返回false,所以会继续传播该事件.
* 在具体项目中此处的返回值视情况而定.
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if ((System.currentTimeMillis() - mkeyTime) > 2000) {
mkeyTime = System.currentTimeMillis();
Toast.makeText(this, "再按一次确认退出", Toast.LENGTH_LONG).show();
} else {
finish();
}
return false;
} else {
return super.onKeyDown(keyCode, event);
}
}
复制代码
就是这样。