zoukankan      html  css  js  c++  java
  • TabActivity 返回键 onBackPressed 监听 dispatchKeyEvent 监听

    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();

    欧克蓝科技
  • 相关阅读:
    完整版:资深程序员都了解的代码复用法则
    Shiro学习总结(10)——Spring集成Shiro
    Shiro学习总结(2)——Apache Shiro快速入门教程
    Shiro学习总结(2)——Apache Shiro快速入门教程
    Mysql学习总结(15)——Mysql错误码大全
    Mysql学习总结(15)——Mysql错误码大全
    ActiveMQ学习总结(6)——ActiveMQ集成Spring和Log4j实现异步日志
    ActiveMQ学习总结(6)——ActiveMQ集成Spring和Log4j实现异步日志
    对话:一个工程师在蘑菇街4年的架构感悟
    这种反爬虫手段有点意思,看我破了它!
  • 原文地址:https://www.cnblogs.com/sias/p/3903039.html
Copyright © 2011-2022 走看看