转载:Android 如何解决dialog弹出时无法捕捉Activity的back事件

在一些情况下,我们需要捕捉back键事件,然后在捕捉到的事件里写入我们需要进行的处理,通常可以采用下面三种办法捕捉到back事件:

  1)重写onKeyDown或者onKeyUp方法

  2)重写onBackPressed方法

  3)重写dispatchKeyEvent方法

  这三种办法有什么区别在这里不进行阐述,有兴趣的朋友可以查阅相关资料。

  然而在有dialog弹出时,想捕捉back键的事件的话,上述三种办法都无法实现。因为上述方法是重写在activity里面的,也就是说当activity是当前焦点时,它可以捕捉到相应的back键事件,而有dialog弹出时,dialog获取了当前焦点,所以activity里面的方法无法获取到back键事件,此时有两种思路:

  1)设置dialog的setOnCancelListener监听:

selectDialog.setOnCancelListener(new OnCancelListener() {
               
                @Override
                public void onCancel(DialogInterface dialog) {
                    // TODO Auto-generated method stub
           
                       // Toast.makeText(getBaseContext(), "点击了back", Toast.LENGTH_SHORT).show();
                }
            });

这样就可以捕捉到back键的事件了,当按下back键时,系统默认的操作会让dialog cancel掉,此时会触发OnCancelListener,然后在onCancel方法里面就可以实现自己想要实现的操作了。

  2)设置dialog的setOnKeyListener并重写dispatchKeyEvent方法

  selectDialog.setOnKeyListener(new OnKeyListener() {
               
                @Override
                public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
                    // TODO Auto-generated method stub
                    if(keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount()==0)
                    {
                        dialog.dismiss();
                    }
                    return false;
                }
            });
  public boolean dispatchKeyEvent(KeyEvent event)
    {
       
        switch(event.getKeyCode())
        {
        case KeyEvent.KEYCODE_BACK:          
            Toast.makeText(getBaseContext(), "点击了back", Toast.LENGTH_SHORT).show();
            break;
        default:
            break;
        }
        return super.dispatchKeyEvent(event);
    }

然后在dispatchKeyEvent里面就可以实现自己想要实现的操作了。

时间: 2024-10-17 04:24:52

转载:Android 如何解决dialog弹出时无法捕捉Activity的back事件的相关文章

窗体 dialog 弹出时动画效果

1.先创建 anim中的 xml  动画文件 <?xml version="1.0" encoding="utf-8"? > <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:fromXScale="0.1" android:toXScale="1" android:f

窗口 dialog 弹出时动画效果

1.先创建 anim中的 xml  动画文件 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:fromXScale="0.1" android:toXScale="1" android:fr

解决键盘弹出时,webview被挤压导致背景图片被挤压出空白

第一种方法: 1.给外层div容器设置背景图片 style="height: 100%;background: url(../../images/10.jpg);background-size: 100% 100%;" 2.监听键盘弹出事件,弹出时调整容器的高度以适应背景图片 <body onresize="windowSizeChange();"> var oglHeight = document.querySelector("body&qu

Android学习—解决界面弹出输入框时Tabhost上移的问题

在一个Tabhost页签界面,里面有多个EditText可以输入,但是每次文本框获得焦点弹出系统键盘时,位于底部的Tab被顶到中间去了,而且还会导致输入无效: 对于这种问题,可以通过下面的设置解决: 修改AndroidManifest.xml文件,在Tabhost所在的Activity中加入:android:windowSoftInputMode="adjustPan|stateVisible" 如下: <activity android:name="com.yag.U

Extjs 窗体居中,双重窗体弹出时清除父窗体的鼠标事件

这个是监控窗体缩放的事件 缩放中居中主要在 'beforeshow' 和 'destroy'两个事件里面监控 var EditTempWindow; Ext.EventManager.onWindowResize(function() { if (EditTempWindow) { EditTempWindow.center() } }); Ext.define("Define.Class.EditWindow", { id: 'RoomEditWin', xtype: 'window

Android 软键盘弹出时布局内指定内容上移实现及问题解决

Android SDK目前提供的软键盘弹出模式接口只有两种: 一是弹出时自动回冲界面,将所有元素上顶, 一种则是不重绘界面,直接将控件元素遮住,   没有其他模式,如果想实现其他效果,光使用系统接口是不行的.   解决方法:   第一步:给想要被顶上去的内容嵌套一个 ScrollView :   <ScrollView     android:layout_width="match_parent"     android:layout_height="0dp"

Android软键盘弹出时布局问题

最近项目需要做一个类似聊天室的模块,基于Socket实现的,这部分稍后一段时间再做总结,功能上的相关点都实现了小例子也做出来了,最后发现一个比较腻歪的问题就是软键盘弹出时总是会把标题“挤出”屏幕,(无论标题是写在布局中还是仿照theme的方式添加到style中),输入时有失观赏如下图:      隐隐感觉之前项目一直有类似问题,只不过一般只在登陆界面,无伤大雅,用户输入后一掠而过,可以忽略,但这个页面这么处理确实不太美观. 查了下此类问题大致两种思路解决:         一.调整布局在底层使用

解决jqueryeasyUI dialog 弹出窗口超出浏览器,导致不能关闭的bug

使用panel的onMove事件解决了panel,dialog以及window组件在被拖动时,会超出浏览器边界而无法拖回的情况. 当窗口被拖出浏览器有边界时,$(document).width();会增大,增大的部分就是窗口超过浏览器窗口的部分,所以right > browserWidth条件永远无法满足. 如果我们在思考得多一点,其实对于panel,dialog,window三个组件,我们往往要求的并不是它不能超出浏览器界限,而是要求它不能超出父元素界限,而且当父元素的overflow不是hi

android service Dialog 弹出框

android service Dialog 弹出框 相信大家第一次在Service中实现 AlertDialog 弹出框时,都会遇到应用闪退然后报出这个异常: Caused by: android.view.WindowManager$BadTokenException: 下面说下为什么出现这个异常,原因很简单,是由于 AlertDialog 的显示是依赖于一个确定的Activity类,所以要想在 Service 中实现弹出来,需要做如下配置: 1.安装常规写好 AlertDialog 功能块