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

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 16:39   1281   0

想象一下这样的一个情景:弹出一个对话框,里面可以编辑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的关闭和显示。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP