在Android中,如何从一个对话框中打开另一个对话框?

16
我试图在另一个对话框的“onClick”监听器中显示一个对话框,但第二个对话框不会显示。我搜索并找到了一个类似的问题- Android中的对话框顺序,尝试提供的解决方案,但即使如此也不起作用。
我的代码与答案中提供的代码非常相似。

public void onClick(DialogInterface dialog, int id) { showDialog(SECOND_DIALOG); dialog.dismiss(); }

非常感谢您的任何帮助。
谢谢,
Akshay

只需在对话框点击时隐藏和显示视图 - Goodlife
我能够从DialogFragment中显示PopupWindow,但是尝试从另一个PopupWindow中显示则会出现"WindowManagerBadTokenException"异常。 - samus
3个回答

10

我是这样做的:

    if (!appPrefs.getAcceptedUsageAggrement()) {
        tracker.trackPageView("/UsageAgreementDialog");
        acceptedUsage_alertDialog = new AlertDialog.Builder(BroadcastSMSActivity.this)
        .setTitle(R.string.accept_usage_title)
        .setMessage(R.string.accept_usage_message)
        .setNegativeButton(android.R.string.cancel, new AlertDialog.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                finish();
            }
        })
        .setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                if (appPrefs.getAppVer().equals("")) {
                    tracker.trackEvent("Application", "Install", getAppVerName(), 1);
                } else {
                    tracker.trackEvent("Application", "Upgrade", appPrefs.getAppVer().toString()+"->"+getAppVerName(), 1);
                }
                displayRecentChanges = true;
                appPrefs.saveAppVer(getAppVerName());
                appPrefs.saveAcceptedUsageAggrement(true);
            // Display Recent Changes on 1st use of new version
                if (displayRecentChanges) {
                    tracker.trackPageView("/RecentChangesDialog");
                    recentChanges_alertDialog = new AlertDialog.Builder(BroadcastSMSActivity.this)
                    .setTitle(getString(R.string.changes_title, getAppVerName()))
                    .setMessage(R.string.changes_dialog)
                    .setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            recentChanges_alertDialog.cancel();
                            acceptedUsage_alertDialog.cancel();
                        }
                    })
                    .create();
                    recentChanges_alertDialog.show();
                }
            }
        })
        .create();
        acceptedUsage_alertDialog.show();
    }

1
谢谢Bill!这个可行!显然调用活动上下文的showDialog()不起作用。 - Akshay
我不确定我是否在正确的位置接受了acceptUsage_alertDialog.cancel(),但我可以告诉你,当我在onClick()中取消它并尝试创建后续对话框时,它导致了强制关闭。因此,我觉得将它的.cancel()移动到第二个对话框的.cancel()之后是很自然的。 - Bill Mote
你可能还注意到了一些很酷的Google Analytics技巧...我正在记录这个应用程序的运行是一个新安装还是升级。如果是升级,我会记录他们来自哪个版本以及正在安装的版本:1.5->1.8等等。 - Bill Mote

7

我知道这个问题有一段时间了,但是我找到了一个相当不错的解决方案。

我定义了一个如下的接口:

public interface OpenDialog {

public void showDialog(DialogFragment dialog);

}

接着,我的活动实现了一个接口,当对话框被打开时,将对自身的引用传递给它,使用我的InterfaceHolder类:

public class MyActivity extends FragmentActivity implements OpenDialog {

@Override
protected void onCreate(Bundle arg0) {
    super.onCreate(arg0);

    InterfaceHolder.set(this);        
    showDialog(new DialogOne());

}

public void showDialog(DialogFragment dialog) {
    dialog.show(getSupportFragmentManager(), "tag");
}

InterfaceHolder 只是一个带有对接口的静态引用的类,用于在不同组件之间传递。

public class InterfaceHolder {
private static OpenDialog openDialog;

public void set(OpenDialog openDialog)
    this.openDialog = openDialog;
}

public void get()
    return openDialog;
}

所以showDialog方法将显示我传递给它的任何对话框;正如您可以看到,我这样做是为了显示DialogOne。现在,如果我想在“DialogOne”中打开一个名为“DialogTwo”的新对话框,我可以通过编写以下代码来调用它:

InterfaceHolder.get().showDialog(new DialogTwo());
dismiss();

然后,DialogTwo就会显示出来。显然,你需要注意确保已经将你的活动引用传递给了InterfaceHolder(一个不错的方法是在showDialog方法内部放置InterfaceHolder.set(this)),但除此之外,这似乎非常完美地运行。


2
我的建议是使用这段代码。对话框1上有一个按钮,当点击它时,会调用对话框2。
    private Dialog dialog;
    private AlertDialog.Builder voteBuilder;

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);     

    // Firat dialog
            dialog = new Dialog(QrCodeReader.this);
            dialog.setContentView(R.layout.customdialog_qr);
            dialog.setCancelable(false);

    // Second dialog
            showVotingDialog();

    //set up button of dialog 1
            Button btnVote = (Button) dialog.findViewById(R.id.btnVote);
            btnVote.setOnClickListener(new OnClickListener() {
            @Override
                public void onClick(View v) {
                    dialog.dismiss();
                    voteBuilder.show();
                }
            });

dialog.show();
    }

    private void showVotingDialog() {
            voteBuilder = new AlertDialog.Builder(this);
            voteBuilder.setTitle(R.string.votingdialog_title);
            voteBuilder.setCancelable(false);
            LayoutInflater inflater = getLayoutInflater();
            final View checkboxLayout = inflater.inflate(R.layout.voting_dialog, null);
            voteBuilder.setView(checkboxLayout);
            voteBuilder.setPositiveButton(R.string.menu_ok, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    RadioGroup radioGroup = (RadioGroup) checkboxLayout.findViewById(R.id.vote_radiogroup);
                    int checkedRadioButton = radioGroup.getCheckedRadioButtonId();
                    int radioButtonSelected = 0;
                    switch (checkedRadioButton) {
                        case R.id.vote_item1 : radioButtonSelected = 1; break;
                        case R.id.vote_item2 : radioButtonSelected = 3; break;
                        case R.id.vote_item3 : radioButtonSelected = 5; break;
                        case R.id.vote_item4 : radioButtonSelected = 10; break;
                        case R.id.vote_item5 : radioButtonSelected = 20; break;
                        default: radioButtonSelected = 0;
                    }

                    sendVoteBySMS(radioButtonSelected);
                }
            });
            voteBuilder.setNegativeButton(R.string.menu_cancel, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    QrCodeReader.this.finish();
                }
            });

            voteBuilder.create();
    //      voteBuilder.show();
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接