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_DOWNACTION_UP,也就是按下和松开,如果不加这个判断,代码会执行两遍,而在下面的代码中就是弹两次AlertDialog。

  1. @Override  
  2.     public boolean dispatchKeyEvent(KeyEvent event) {  
  3.         if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN ) {  
  4.             // 需要监听的事件  
  5.             AlertDialog.Builder builder = new AlertDialog.Builder(  
  6.                     MainActivity.this)  
  7.                     .setIcon(R.drawable.logo)<span style="font-size: 14px;">//设置图片</span>  
  8.                     .setTitle("提示")  
  9.                     .setMessage("您是否要退出?");  
  10.                     builder.setPositiveButton("确定",  
  11.                             new OnClickListener() {  
  12.                                 public void onClick(DialogInterface dialog, int which) {  
  13.                                     MainActivity.this.finish();  
  14.                                       
  15.                                 }  
  16.                             });  
  17.                     builder.setNegativeButton("取消",  
  18.                             new OnClickListener() {  
  19.   
  20.                                 public void onClick(DialogInterface dialog,  
  21.                                         int which) {  
  22.                                     dialog.cancel();  
  23.                                 }  
  24.                             });  
  25.             builder.create().show();  
  26.             return false;  
  27.         }  
  28.         return super.dispatchKeyEvent(event);  
  29.     }  
@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();