1. 程式人生 > >Android Dialog點選按鈕不關閉,控制視窗的顯示和關閉

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的關閉和顯示。