Android Dialog点击按钮不关闭,控制窗口的显示和关闭

想象一下这样的一个情景:弹出一个对话框,里面可以编辑sql语句,编辑好以后点击确定按钮,执行sql,此时对话框也会消失。如果sql顺利执行,这种交互还是很不错的。但是一旦sql执行出错,对话框还是会关闭,对话框中的sql也就没有了,只能重新编辑。如果sql很复杂,那么这种交互完全可以毁掉你的这个应用。好比注册信息,填了n多项,只有一项出错,界面却把所有填好的信息都丢失掉...用户会恨不得杀了你、

dialog在默认情况下只要你点击了它的按钮,它都要进行关闭,为了在上述情况中拥有良好的交互性,必须得找出一种办法,可以让dialog在需要关闭的时候再进行关闭。

下段代码也是在网上找的,并非自己研究,特此声明。

public class DialogDemo extends Activity {

    AlertDialog dialogDemo;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AlertDialog.Builder dialogBuild = new AlertDialog.Builder(this);
        dialogBuild.setPositiveButton("sure", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                if (true) {
                    //该条件下不关闭dialog
                    keepDialogOpen(dialogDemo);
                    //...doSomeThing();
                } else {
                    //该条件下关闭dialog
                    closeDialog(dialogDemo);
                    //此句最好不要省略,否则在有些情况下dialog不关闭
                    dialog.dismiss();
                }
            }
        });

        dialogBuild.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //取消按钮在任何条件下都关闭
                closeDialog(dialogDemo);
                //此句最好不要省略,否则在有些情况下dialog不关闭
                dialog.dismiss();
            }
        });

        dialogDemo = dialogBuild.create();
        dialogDemo.show();

    }

    //保持dialog不关闭的方法
    private void keepDialogOpen(AlertDialog dialog) {
        try {
            java.lang.reflect.Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
            field.setAccessible(true);
            field.set(dialog, false);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //关闭dialog的方法
    private void closeDialog(AlertDialog dialog) {
        try {
            java.lang.reflect.Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
            field.setAccessible(true);
            field.set(dialog, true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


通过上面两个方法,我们可以根据需求来控制dialog的关闭和显示。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值