Android从对话框中显示另一个对话框
我想从另一个对话框的按钮的onClick监听器中显示一个对话框,但第二个对话框不会显示。我搜索并发现了类似的问题Dialogs order in Android,尝试提供的解决方案,但即使这样也行不通。Android从对话框中显示另一个对话框
我的代码与答案中提供的代码非常相似。
公共无效的onClick(DialogInterface 对话框,INT ID){ 的ShowDialog(SECOND_DIALOG); dialog.dismiss(); }
任何帮助将是非常赞赏。
感谢,
阿克沙伊
这是我正在做它:
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时有一个按钮,然后对话框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();
}
我知道这是前一段时间问的,但是我发现这里有一个非常简洁的解决方案。
我定义一个接口是这样的:
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。现在,如果我想开一个名为“DialogTwo”内部“DialogOne”新的对话框,我可以写作称之为:
InterfaceHolder.get().showDialog(new DialogTwo());
dismiss();
瞧,DialogTwo所示。显然,你必须小心确保对你的活动的引用已经传递给InterfaceHolder(一个很好的方法是将InterfaceHolder.set(this);放在showDialog方法中),但是否则这似乎工作精美。
只需在对话框中隐藏并显示视图点击
请为此添加评论。无需为此提供答案 – 2016-12-15 09:50:19
谢谢比尔!这工作!显然调用活动上下文的showDialog()不会。 – Akshay 2011-04-14 13:55:24
我不确定我是否已接受Usage_alertDialog.cancel();在正确的地方,但我可以告诉你,当我取消它onClick(),然后尝试创建后续对话框时,它导致了一个关闭的力量。所以,在第二个对话框的cancel()之后移动它的.cancel()就显得很自然。 – 2011-04-14 14:20:53
您可能还会注意到那里有一些很酷的Google Analytics技巧......我在记录此应用程序的运行是新安装还是升级。如果是升级版,我会记录它们的版本以及正在安装的版本:1.5-> 1.8等。 – 2011-04-14 14:24:50