`

控制android弹出框不消失(用到反射的方法)

阅读更多

Android中的弹出框在被点击时, 无论点击哪个按钮都会关闭窗口。 但是有的情况下我们不需要立即关闭窗口。下面的情况是弹出框中要求用户输入文件名, 并在点击确定时检查文件名的合法性, 不合法则提示用户重新输入, 弹出框要保持在界面上。 点击取消时弹出框消失。 这里通过对控件的反射来实现: 
/**our button handler**/ 
    private ButtonHandler bHandler; 

//pop up dialog with own button handler 
    private void popUpDialog(AlertDialog dialog) { 
        /* 
         * alert dialog's default handler will always close dialog whenever user 
         * clicks on which button. we have to replace default handler with our 
         * own handler for blocking close action. 
         * Reflection helps a lot. 
         */ 
        try { 
            Field field = dialog.getClass().getDeclaredField("mAlert"); 
            field.setAccessible(true); 
            
            //retrieve mAlert value 
            Object obj = field.get(dialog); 
            field = obj.getClass().getDeclaredField("mHandler"); 
            field.setAccessible(true); 
            //replace mHandler with our own handler 
            field.set(obj, bHandler); 
        } catch (SecurityException e) { 
            Debug.error(e.getMessage()); 
        } catch (NoSuchFieldException e) { 
            Debug.error(e.getMessage()); 
        } catch (IllegalArgumentException e) { 
            Debug.error(e.getMessage()); 
        } catch (IllegalAccessException e) { 
            Debug.error(e.getMessage()); 
        } 
        
        //we can show this dialog now. 
        dialog.show(); 
    } 
    /* 
     * define our own button handler, do not deal with dismiss message. 
     */ 
    class  ButtonHandler  extends  Handler { 

         private  WeakReference<DialogInterface> mDialog; 

         public ButtonHandler(DialogInterface dialog) { 
            mDialog = new WeakReference<DialogInterface>(dialog); 
         } 

         public void handleMessage(Message msg) { 
             switch (msg.what) { 
                 case DialogInterface.BUTTON_POSITIVE: 
                 case DialogInterface.BUTTON_NEGATIVE: 
                 case DialogInterface.BUTTON_NEUTRAL: 
                    ((DialogInterface.OnClickListener) msg.obj).onClick(mDialog 
                            .get(), msg.what); 
                     break ; 
            } 
        } 
    } 

然后创建一个AlertDialog时如下去调用: 
//create dialog 
            mDialog = new AlertDialog.Builder(mContext) 
            .setView(selectImageView) 
            .setNegativeButton(android.R.string.cancel, mOnDialogClickListener) 
            .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 
                public void onClick(DialogInterface dialog, int arg1) { 
                    //check input file name 
                    if (isValidFileName(fileNameInput.getText().toString())) { 
                        String fileName = fileNameInput.getText().toString().trim(); 
                        mediaList.get(0).setName(fileName); 
                        saveMedia(mediaList); 
                        dialog.dismiss(); 
                    } else { 
                        Toast.makeText(mContext, R.string.invalid_file_name, 1500).show(); 
                    } 
                    
                } 
            }).create(); 
mOnDialogClickListener用来处理关闭窗口事件: 
/* 
     * cancel dialog listener 
     */ 
    OnClickListener mOnDialogClickListener = new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int buttonId) { 
            switch (buttonId) { 
                case DialogInterface.BUTTON_NEGATIVE: 
                    dialog.dismiss(); 
                    break; 
                case DialogInterface.BUTTON_POSITIVE: 
                    
                    break; 
            } 
            
        } 
    };

分享到:
评论

相关推荐

    Android自定义弹出框实现(修改版)完整实例源码

    在Android开发中,为了提供更好的用户体验,我们常常需要自定义弹出框来替代系统默认的对话框。这个“Android自定义弹出框实现(修改版)完整实例源码”就是一个很好的示例,它展示了如何根据自己的需求设计和构建...

    Android:动画实现精美的弹出框(仿易信)

    一个用于控制弹出框从无到有平滑出现,另一个则相反,让弹出框平滑消失。在动画过程中,我们可以改变PopupWindow的宽度、高度或透明度来实现不同的动画效果。 4. **监听器**:为动画设置开始和结束监听器,以便在...

    android仿QQ底部弹出框选择头像

    在Android应用开发中,创建一个类似QQ的底部弹出框选择头像的功能涉及到多个关键知识点。这个功能允许用户选择头像,既可以打开相机拍摄新照片,也可以从本地图库选取已有图片,并提供图像剪切功能以调整图片大小。...

    android自定义弹出框

    android自定义弹出框android自定义弹出框android自定义弹出框android自定义弹出框android自定义弹出框android自定义弹出框android自定义弹出框android自定义弹出框android自定义弹出框android自定义弹出框android...

    android自定义弹出框样式的实现方法

    做项目时,感觉android自带的弹出框样式比较丑,很多应用都是自己做的弹出框,这里也试着自己做了一个。 废话不说先上图片: 实现机制 1.先自定义一个弹出框的样式 2.自己实现CustomDialog类,继承自Dialog,实现...

    android自定义弹出框实现

    在Android开发中,自定义弹出框是一种常见的需求,它能提供更加个性化和与应用风格一致的用户体验。本文将深入探讨如何在Android中实现自定义弹出框,并以"CustomDialog"为例,介绍其实现过程。 首先,Android系统...

    Android 点击listview弹出popupwindow弹出框

    本篇将详细介绍如何在用户点击`ListView`时弹出一个包含`PopupWindow`的弹出框,并且这个`PopupWindow`内还具有`ListView`的右滑删除功能。 首先,我们需要创建`PopupWindow`。`PopupWindow`的构造函数通常接收三个...

    android 仿iOS弹出框效果demo

    在Android开发中,为了提供与iOS相似的用户体验,开发者有时会尝试模仿iOS的某些界面元素,比如弹出框效果。这个“android 仿iOS弹出框效果demo”就是这样一个示例,它展示了如何在Android平台上实现类似iOS的对话框...

    Android中长按弹出选项框View进行操作

    本教程将详细讲解如何在Android应用中实现长按View弹出选项框的功能。 首先,你需要创建一个`PopupMenu`对象。`PopupMenu`类是Android SDK提供的用于创建弹出菜单的工具。在长按事件的监听器中实例化这个对象: ``...

    Android使用Activity用作弹出式对话框

    在Android开发中,有时我们需要创建一个弹出式对话框来与用户进行交互,但不同于常见的`Dialog`类,我们可以利用`Activity`来实现这一功能。这种方式适用于需要更复杂交互或者自定义布局的情况。本文将详细讲解如何...

    Android自定义弹出多选框,可全选

    本教程将聚焦于如何在Android应用中实现一个自定义的弹出多选框,并实现全选功能。这个自定义组件可以用于让用户在一组选项中进行多项选择,如设置、过滤等场景。 首先,我们需要创建一个新的布局文件来设计多选框...

    高仿微信朋友圈点赞、评论弹出框效果(自定义Popupwindow实现)

    在Android应用开发中,创建一个高仿微信朋友圈点赞和评论的弹出框效果是一个常见的需求。这个Demo就是针对这一需求,通过自定义`PopupWindow`实现的。`PopupWindow`是Android系统提供的一种轻量级的弹出对话框,它...

    自定义控件 ActionSheetDemo(仿QQ弹出框)

    在ActionSheetDemo中,弹出框的出现和消失可能需要用到动画效果,如淡入淡出、平移或缩放。这需要掌握`ObjectAnimator`、`ValueAnimator`或者`Animation`类的使用,通过这些工具可以实现各种复杂的动画效果。 此外...

    android PackageManager 反射调用相关的类

    Android PackageManager 有很多方法是没有暴漏出来的,我们如果想调用的话需要用Java反射。android_dependency.jar 提供了反射调用相关的class定义,直接放到你的工程libs目录下面,然后就可以进行反射调用...

    Android底部弹出iOS7风格对话框_库文件资源

    本文将深入探讨如何在Android平台上实现底部弹出的iOS7风格对话框,以及如何将提供的库文件资源集成到自己的项目中。 首先,iOS7风格对话框的特点在于其简洁的设计和半透明的效果,通常用于显示一些临时信息或简单...

    android 底部弹出菜单(带透明背景)

    如果你希望菜单有动画效果,可以添加动画库,如`androidx.core:core-animate:1.1.0`,然后使用`TranslationAnimation`或`SlideTransition`进行平滑的弹出和消失。 另外,为了实现点击菜单项后的操作,你需要在`...

    Android 自定义 弹框,日期选择器 弹框,年月日,时分,

    首先,我们需要创建一个自定义 DialogFragment,它是Android框架提供的一个类,可以方便地创建和管理弹出对话框。在DialogFragment中,我们可以定义布局文件,该布局文件将包含我们的日期和时间选择器组件。通常,...

    Android判断软键盘是否弹出

    在Android开发中,有时我们需要检测应用中的软键盘是否弹出,以便进行相应的界面调整或功能控制。例如,当用户打开虚拟键盘时,我们可能需要自动调整输入框的位置,或者在键盘隐藏时恢复原来的布局。标题“Android...

    Android popupWindow仿微信弹出效果

    2. **背景暗化**:微信弹出框出现时,会将背景界面稍微变暗,以突出弹出框。这可以通过在`PopupWindow`上添加半透明背景层实现,或者在弹出时调整根布局的透明度。 3. **点击弹出框外部隐藏**:当用户点击弹出框外...

Global site tag (gtag.js) - Google Analytics