Android对话框,当按下button时保持对话框打开

我想保持我的对话框打开,当我按下button。 目前正在closures。

AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Are you sure you want to exit?") .setCancelable(false) .setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { MyActivity.this.finish(); } }) .setNegativeButton("No", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); AlertDialog alert = builder.create(); 

是的你可以。 你基本上需要:

  1. 使用DialogBu​​ilder创build对话框
  2. 显示()对话框
  3. 在显示的对话框中findbutton并重写onClickListener

所以,创build一个监听器类:

 class CustomListener implements View.OnClickListener { private final Dialog dialog; public CustomListener(Dialog dialog) { this.dialog = dialog; } @Override public void onClick(View v) { // Do whatever you want here // If you want to close the dialog, uncomment the line below //dialog.dismiss(); } } 

然后在显示对话框时使用:

 AlertDialog dialog = dialogBuilder.create(); dialog.show(); Button theButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE); theButton.setOnClickListener(new CustomListener(dialog)); 

请记住,您需要显示对话框,否则button将无法find。 此外,请务必将DialogInterface.BUTTON_POSITIVE更改为您用来添加button的任何值。 另外请注意,在DialogBu​​ilder中添加button时,您将需要提供onClickListeners – 您不能在其中添加自定义侦听器,但如果您在调用show()之后没有重写侦听器,对话框仍将closures。

感谢Sogger的回答,但是在这里我们要做的一个改变就是,在创build对话框之前,我们应该把AlertDialog设置为正确的button(如果需要的话)

由Sogger引用。

这里是示例示例…

 AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Test for preventing dialog close"); builder.setTitle("Test"); builder.setPositiveButton("OK", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }); builder.setNegativeButton("Cancel", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }); final AlertDialog dialog = builder.create(); dialog.show(); //Overriding the handler immediately after show is probably a better approach than OnShowListener as described below dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Boolean wantToCloseDialog = false; //Do stuff, possibly set wantToCloseDialog to true then... if(wantToCloseDialog) dialog.dismiss(); //else dialog stays open. Make sure you have an obvious way to close the dialog especially if you set cancellable to false. } }); dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Boolean wantToCloseDialog = true; //Do stuff, possibly set wantToCloseDialog to true then... if(wantToCloseDialog) dialog.dismiss(); //else dialog stays open. Make sure you have an obvious way to close the dialog especially if you set cancellable to false. } }); 

我相信@Kamen的答案是正确的,这是一个使用匿名类相同的方法的例子,所以它是在一个代码stream:

 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setMessage("Test for preventing dialog close"); AlertDialog dialog = builder.create(); dialog.show(); //Overriding the handler immediately after show is probably a better approach than OnShowListener as described below dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Boolean wantToCloseDialog = false; //Do stuff, possibly set wantToCloseDialog to true then... if(wantToCloseDialog) dismiss(); //else dialog stays open. Make sure you have an obvious way to close the dialog especially if you set cancellable to false. } }); 

我写了一个更详细的文章来回答同样的问题在这里https://stackoverflow.com/a/15619098/579234也有其他对话框,如DialogFragment和DialogPreference的例子。;

这是我如何设法改变密码时创build一个持久的popup窗口。

 // Login Activity AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.SetIcon(Resource.Drawable.padlock); alert.SetCancelable(false); var changepass = LayoutInflater.From(this); var changePassLayout = changepass.Inflate(Resource.Layout.ChangePasswordLayout, null); alert.SetView(changePassLayout); txtChangePassword = (EditText)changePassLayout.FindViewById(Resource.Id.txtChangePassword); txtChangeRetypePassword = (EditText)changePassLayout.FindViewById(Resource.Id.txtChangeRetypePassword); alert.SetPositiveButton("Change", delegate { // You can leave this blank because you override the OnClick event using your custom listener }); alert.SetNegativeButton("Cancel", delegate { Toast.MakeText(this, "Change password aborted!", ToastLength.Short).Show(); }); AlertDialog changePassDialog = alert.Create(); changePassDialog.Show(); // Override OnClick of Positive Button Button btnPositive = changePassDialog.GetButton((int)Android.Content.DialogButtonType.Positive); btnPositive.SetOnClickListener(new CustomListener(changePassDialog, empDetailsToValidate.EmployeeID)); 

 // My Custom Class class CustomListener : Java.Lang.Object, View.IOnClickListener, IDialogInterfaceOnDismissListener { AlertDialog _dialog; EditText txtChangePassword; EditText txtChangeRetypePassword; EmployeeDetails _empDetails; string _workingEmployeeID; public CustomListener(AlertDialog dialog, string employeeID) { this._dialog = dialog; this._workingEmployeeID = employeeID; } public void OnClick (View v) { _empDetails = new EmployeeDetails(v.Context); txtChangePassword = (EditText)_dialog.FindViewById (Resource.Id.txtChangePassword); txtChangeRetypePassword = (EditText)_dialog.FindViewById (Resource.Id.txtChangeRetypePassword); if (!(txtChangePassword.Text.Equals(txtChangeRetypePassword.Text))) { Show (); Toast.MakeText(v.Context, "Password not match.", ToastLength.Short).Show(); } else if (txtChangePassword.Text.Trim().Length < 6) { Show (); Toast.MakeText(v.Context, "Minimum password length is 6 characters.", ToastLength.Short).Show(); } else if ((txtChangePassword.Text.Equals(LoginActivity.defaultPassword)) || (txtChangePassword.Text == "" || txtChangeRetypePassword.Text == "")) { Show (); Toast.MakeText(v.Context, "Invalid password. Please use other password.", ToastLength.Short).Show(); } else { int rowAffected = _empDetails.UpdatePassword(_workingEmployeeID, SensoryDB.PassCrypto(txtChangePassword.Text, true)); if (rowAffected > 0) { Toast.MakeText(v.Context, "Password successfully changed!", ToastLength.Short).Show(); _dialog.Dismiss(); } else { Toast.MakeText(v.Context, "Cant update password!", ToastLength.Short).Show(); Show(); } } } public void OnDismiss (IDialogInterface dialog) { if (!(txtChangePassword.Text.Equals (txtChangePassword.Text))) { Show (); } else { _dialog.Dismiss(); } } public void Show () { _dialog.Show (); } } 

顺便说一句,我使用Mono的Android而不是Eclipse。

您可能需要定义自己的布局,而不是使用“官方”button; 你所要求的行为并不是典型的对话。

你可以得到从方法“show()”alertBuidler返回的Dialog。

 AlertDialog.Builder adb = new AlertDialog.Builder(YourActivity.this); //...code to add methods setPositive an setNegative buttons 

调用“adb”的“show()”方法并获得Dialog

 final AlertDialog dialog = adb.show(); 

所以你可以在你的活动的任何代码点调用你的对话框的任何button:

 dialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();//or dialog.getButton(DialogInterface.BUTTON_NEGATIVE).performClick();//or dialog.getButton(DialogInterface.BUTTON_NEUTRAL).performClick(); 

您不需要创build自定义类。 您可以为AlertDialog注册一个View.OnClickListener。 这个监听器不会closuresAlertDialog。 这里的技巧是你需要在显示对话框后注册监听器,但是它可以在OnShowListener中完成。 您可以使用一个附件布尔variables来检查是否已经完成,以便它只会被执行一次:

 /* * Prepare the alert with a Builder. */ AlertDialog.Builder b = new AlertDialog.Builder(this); b.setNegativeButton("Button", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) {} }); this.alert = b.create(); /* * Add an OnShowListener to change the OnClickListener on the * first time the alert is shown. Calling getButton() before * the alert is shown will return null. Then use a regular * View.OnClickListener for the button, which will not * dismiss the AlertDialog after it has been called. */ this.alertReady = false; alert.setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(DialogInterface dialog) { if (alertReady == false) { Button button = alert.getButton(DialogInterface.BUTTON_NEGATIVE); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //do something } }); alertReady = true; } } });