`
seya
  • 浏览: 361523 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

控制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;
            }
           
        }
    };
分享到:
评论
4 楼 m331006 2011-08-16  
楼主,为什么我对着写都不行的呢。。点击按钮时还是消失了。。。popUpDialog方法应该在哪里调用的??楼主看到了回我一下吧。。。急呢。谢谢了。
3 楼 bluecountry 2011-08-12  
膜拜了楼主的大作之后,果断选择自定义对话框...
就2个按钮 不用那么纠结
当然了 思路还是要学习一下
2 楼 seya 2011-04-07  
ET焖猪仔 写道
学些了,楼主是怎么想到用反射的~  ?private  WeakReference<DialogInterface> mDialog; 为什么这里用到弱引用?  期待解答~

这种通过反射的方法也是从网上学来的, 不知原创是谁了。 弱引用的目的是方便垃圾回收, 这里的引用只是为了设置下Dialog里面的控件, 用完以后以后就不再需要持有这个句柄了。 使用弱引用就不会影响到原来对这个控件的垃圾回收过程。
1 楼 ET焖猪仔 2011-03-29  
学些了,楼主是怎么想到用反射的~  ?private  WeakReference<DialogInterface> mDialog; 为什么这里用到弱引用?  期待解答~

相关推荐

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

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

    Android仿美团弹出框购物车

    在Android应用开发中,创建一个类似美团购物车的弹出框是一种常见的需求,它能够提供用户友好的交互体验。这个“Android仿美团弹出框购物车”Demo是为开发者提供了一个可以直接导入Android Studio (AS)并快速查看...

    模拟弹出框

    此外,还可以通过编程逻辑控制弹出框的显示和消失,如在特定操作后自动弹出,或在用户满足某些条件时消失。 在设计模拟弹出框时,应考虑以下几个原则: 1. 清晰性:确保弹出框的内容易于理解和操作,避免过于复杂或...

    仿iOS圆角弹出框

    在Android开发中,为了提供与iOS相似的用户体验,开发者经常需要创建具有圆角设计的弹出框或提示框。这个“仿iOS圆角弹出框”项目,正如其标题所暗示的,是针对这一需求的一个解决方案。通过实现这样的组件,我们...

    reactnative弹出框类似android的DialogFragment

    当用户点击弹出框外的区域或者按下返回键时,弹出框消失。 总的来说,`react-native-xmodal`库为我们提供了在React Native中实现类似Android `DialogFragment`功能的能力,通过简单的配置和使用,我们可以快速构建...

    Android仿ios弹出框效果

    本文将深入探讨如何在Android平台上创建一个仿iOS弹出框效果,包括底部弹出的日期选择器和地址选择器。我们将讨论相关的UI组件、布局设计以及事件处理等方面的知识点。 首先,iOS的弹出框效果通常被称为“Action ...

    Android仿ios弹出框AndroidshowDialog库

    "Android仿ios弹出框AndroidshowDialog库"是专为Android平台设计的一个库,其目标是模仿iOS风格的弹出框,以实现更加统一且具有吸引力的用户界面。这个库不仅简化了开发过程,还提供了高度定制的可能性,特别是在...

    各种弹出框

    开发者可以控制弹出框的大小、形状、动画效果、内容展示以及交互行为。在Android中,可以利用DialogFragment或者AlertDialog实现自定义对话框;在iOS中,可以使用UIAlertController配合自定义视图。对于JavaScript...

    Android:仿QQ 发表说说/上传照片 弹出框

    我们可以为弹出框的显示和消失添加动画效果,比如淡入淡出、滑动进出等,提升应用的交互体验。 在实现这些功能时,我们需要注意以下几点: 1. 数据持久化:如果用户在发表说说的过程中按下返回键,应询问用户是否...

    Android 仿微信朋友圈点赞和评论弹出框功

    在Android应用开发中,模拟微信朋友圈的点赞和评论弹出框功能是一项常见的需求,它涉及到UI设计、事件处理以及数据管理等多个方面的技术。下面将详细解释实现这一功能所需的关键知识点。 1. **自定义对话框(Custom...

    Button的七中弹出框

    PopupWindow是自定义程度最高的弹出框,开发者可以直接控制其布局、大小和位置。它可以用来创建各种复杂的弹出效果,如自定义菜单、工具提示等。 7. **ProgressDialog/ProgressBar** ProgressDialog通常用于显示...

    右下角弹出框

    - **移动应用**:移动平台如Android和iOS也有自己的通知系统,可以模拟右下角弹出框的效果。 3. **应用场景**: - **系统通知**:例如软件更新提示、系统错误报告、消息提醒等。 - **用户引导**:新手引导、功能...

    仿微信右上角弹出框

    2. **动画效果**:为了提供良好的用户体验,弹出框的出现和消失通常会伴随一定的动画效果,如淡入淡出、平滑滑动等。这些效果可以通过编程实现,例如Android的`ObjectAnimator`或iOS的`UIViewAnimationOptions`。 3...

    仿ios弹出框效果(通用)

    4. **动画效果**:iOS弹出框在显示和消失时通常伴有平滑的动画效果,增加用户体验的流畅感。 要实现“仿ios弹出框效果”,开发者需要考虑以下技术点: 1. **布局设计**:在Android中,可以使用自定义对话框...

    zyPopup用户体验超棒的弹出框

    例如,你可以研究其中的布局文件是如何定义弹出框的结构,以及Java或Kotlin代码是如何控制弹出框的行为和动画。 四、最佳实践 1. **合理选择动画**:根据应用场景选择合适的弹出动画,避免过于复杂导致性能下降。 ...

    Android studio实现点击按钮弹出气泡

    总的来说,实现“Android studio实现点击按钮弹出气泡”这一功能,需要掌握Android应用开发的基本概念,包括布局设计、事件处理、自定义View、动画和触摸事件等。通过学习和实践,开发者可以创建出富有创意且用户...

    Popwindow一个简单的弹出框

    为了让弹出框显示和消失更有动画感,可以使用`AnimationUtils.loadAnimation()`加载动画资源,然后通过`setAnimationStyle()`设置给`PopupWindow`。 5. **生命周期管理**: `PopupWindow`不是Activity,因此没有...

    Android 自定义弹出框实现代码

    提到的“您可能感兴趣的文章”提到了更多关于Android弹出框的实现,如使用`Dialog`、`PopupWindow`以及各种样式的弹出框,还有带输入功能的弹出框,这些都是在实际开发中常见的弹出框实现方式。 总结起来,这个...

    悬浮框体 androidstudio

    对于"不想在桌面使用"的情况,可以通过监听Activity的生命周期回调来控制悬浮框体的显示和隐藏。例如,在Activity的`onResume()`方法中显示悬浮框体,在`onPause()`或`onStop()`方法中移除它。这样,当Activity不再...

    Android悬浮框弹幕效果

    在Android开发中,有时我们需要实现一些特殊的视觉效果,比如悬浮框和弹幕效果。这个"Android悬浮框弹幕效果"的示例项目就是一个很好的实践,它涵盖了如何利用`WindowManager`服务来创建浮动窗口,以及如何实现弹幕...

Global site tag (gtag.js) - Google Analytics