TabActivity 返回键 onBackPressed 监听 dispatchKeyEvent 监听
早上碰到TabActivity 返回键的监听事件,出现各种问题。瞎忙了一早上,最后google兼看文档终于找到解决的办法。下面结合别人,解决办法:我们知道,在普通的Activity中可以重写onKeyDown(intkeyCode, KeyEventevent)方法对手机按键进行监听,而当要监听的Activity为TabActivity时(其实ListActivity也一样),这个方法并不起作用,因为这个TabActivity 是没有获取到焦点的,焦点在于在TabActivity中的addTab进来的子Activity中其中一个,所以这个方法不起作用。正在开发的应用的首页是一个TabActivity,当用户按下返回键时会退出程序,而这可能是用户无意而为之的,所以当用户按下返回键时要给一个提示。常规方法,像上文说的,重写onKeyDown(intkeyCode, KeyEventevent),根本不起作用;又发现SDK2.0以后新增了一个专门针对返回键的方法onBackPressed(),还是不起作用。google了很久,也没发现什么好的解决办法。只有自己动手了,打开SDK文档,仔细看了一下,发现有一个dispatchKeyEvent(KeyEventevent),一试果然管用,下面是一段示例代码,注意在if判断中要加一个event.getAction() ==KeyEvent.ACTION_DOWN判断,因为按键有两个事件ACTION_DOWN和ACTION_UP,也就是按下和松开,如果不加这个判断,代码会执行两遍,而在下面的代码中就是弹两次AlertDialog。
- @Override
- public boolean dispatchKeyEvent(KeyEvent event) {
- if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN ) {
- // 需要监听的事件
- AlertDialog.Builder builder = new AlertDialog.Builder(
- MainActivity.this)
- .setIcon(R.drawable.logo)<span style="font-size: 14px;">//设置图片</span>
- .setTitle("提示")
- .setMessage("您是否要退出?");
- builder.setPositiveButton("确定",
- new OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- MainActivity.this.finish();
- }
- });
- builder.setNegativeButton("取消",
- new OnClickListener() {
- public void onClick(DialogInterface dialog,
- int which) {
- dialog.cancel();
- }
- });
- builder.create().show();
- return false;
- }
- return super.dispatchKeyEvent(event);
- }
@Override public boolean dispatchKeyEvent(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN ) { // 需要监听的事件 AlertDialog.Builder builder = new AlertDialog.Builder( MainActivity.this) .setIcon(R.drawable.logo)//设置图片 .setTitle("提示") .setMessage("您是否要退出?"); builder.setPositiveButton("确定", new OnClickListener() { public void onClick(DialogInterface dialog, int which) { MainActivity.this.finish(); } }); builder.setNegativeButton("取消", new OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); builder.create().show(); return false; } return super.dispatchKeyEvent(event); }
另外在上面的代码中MainActivity.this.finish()后,其他在在TabActivity中的addTab进来的子Activity们也都会被finish();