如何使用Android正确编码确认对话框?

时间:2015-07-03 15:36:25

标签: java android dialog alertdialog android-alertdialog

这应该是一个非常普遍的事情:有对话框确认继续与用户交互的流程。但是我能提出的最好的信息是我挖的对我来说似乎并不好。我主要扩展了DialogFragment(在第一次搜索示例之后)并实现了NoticeDialogListener。

我开始相信这不是更好的方法,因为就程序流而言,它非常麻烦。程序流程我明白它可能很麻烦,因为Dialog作为主要的另一个线程开始出现,但我想应该有一种更好的方法来为不同的对话框分配不同的响应方法。但除了以下内容之外,我一直无法找到方法。

希望我清楚地描述了我的问题。提前感谢您的回复。

public class Confirm extends DialogFragment {

    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle(sQ);
        builder
                .setPositiveButton(sYes, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        mListener.Yes();
                    }
                })
                .setNegativeButton(sNo, null);
        return builder.create();
    }

    public interface NoticeDialogListener {
        void Yes();
    }
    private NoticeDialogListener mListener;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mListener = (NoticeDialogListener) activity;
    }
}

public class Main extends ActionBarActivity
        implements Confirm.NoticeDialogListener {
...

    private int iDialogMode;
    private final static int DIALOG_ST_0 = 0;
    private final static int DIALOG_ST_1 = DIALOG_ST_1 + 1;
    private final static int DIALOG_ST_2 = DIALOG_ST_1 + 1;

    @Override
    public void Yes() {
        switch (iDialogMode) {
            case DIALOG_ST_0: // follow up HERE0 for what that dialog prompted
                break;
            case DIALOG_ST_1: // HERE1: feeling not smart
                break;
            case DIALOG_ST_2: // HERE2: believe there should be a better way
                break;
        }
    }

    public ... State_0_doing_something (...) {
        ...
        Confirm diaBox = new Confirm (...);
        iDialogMode = DIALOG_ST_0;
        diaBox.show(getSupportFragmentManager(), "State_0");
        // what's supposed to continue if confirmed will be followed up in HERE0 in Yes() 
    }

    public ... State_1_doing_something_else (...) {
        ...
        Confirm diaBox = new Confirm (...);
        iDialogMode = DIALOG_ST_1;
        diaBox.show(getSupportFragmentManager(), "State_2");
        // what's supposed to continue if confirmed will be followed up in HERE1 in Yes() 
    }

    public ... State_2_doing_yet_something_else (...) {
        ...
        Confirm diaBox = new Confirm (...);
        iDialogMode = DIALOG_ST_2;
        diaBox.show(getSupportFragmentManager(), "State_3");
        // what's supposed to continue if confirmed will be followed up in HERE2 in Yes() 
    }
}

我在想是否可以在创建的每个“确认”对话框中附加不同的单击侦听器,而不是使用 global 变量/成员来设置对话框模式/状态。这里缺少函数指针......

2 个答案:

答案 0 :(得分:0)

“那么,为什么我无法在灰色框中正确发布开始声明和结束括号?”

在该文本之前添加4个空格,或在代码文本的前缀和末尾添加`字符。 例: Fake code that does nothing

“程序流程明智地说,无论如何它都很麻烦,因为Dialog作为另一个从主要开始的线程开始”

这基本上是为什么它不打算让用户继续使用对话框。到目前为止,我看到大多数程序的方式是,只有可能严重延迟应用程序或可能对用户收费的操作才会使用对话框。

另外,请注意,Activity生命周期会让您记住其“状态”,这可能会进一步增加onPause / onResume与您的应用程序的问题。

答案 1 :(得分:0)

解决:唯一的问题是它看起来并不好看

AlertDialog.Builder builder = new AlertDialog.Builder(Home.theContext);
            builder.setMessage(R.string.confirm_delete);
            builder.setCancelable(true);
            builder.setPositiveButton(R.string.confirm_yes, vCabDelete());
            builder.setNegativeButton(Home.theContext.getString(R.string.confirm_no), null);
            AlertDialog dialog = builder.create();
            dialog.show();

....

private static DialogInterface.OnClickListener vCabDelete() {
    return new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface di, int id) {
            ....
        }
    };
}