Android AlertDialog,在每个请求上dynamic改变文本

我想显示一个AlertDialog,其中一个选项可能会在每个请求中更改。 所以,例如,我曾经想要显示“添加到联系人”选项,而另一次它应该是“从联系人中删除”。

我的代码第一次工作,但Android似乎cachingAlertDialog,以便下次不执行onCreateDialog。 因此该选项不再改变。 我可以防止这种caching,或者只是改变选项的另一种方式吗?

我正在使用SDK 1.5,但使用1.1。

@Override protected Dialog onCreateDialog(final int id) { ... String add_remove_contact = res.getString(R.string.profile_add_to_contacts); if (user.getContacts().contains(profileID)) { add_remove_contact = res.getString(R.string.profile_remove_from_contacts); // TODO: this string is not changed when contact status changes } final CharSequence[] items = {res.getString(R.string.view_profile), res.getString(R.string.profile_send_message), add_remove_contact}; AlertDialog.Builder builder = new AlertDialog.Builder(this); ... return builder.create(); } 

Solutions Collecting From Web of "Android AlertDialog,在每个请求上dynamic改变文本"

你也可以使用Activity的removeDialog(int)函数。 当一个对话框被解散时,Activity基本上存储了对话框的状态(出于性能方面的考虑)。 调用对话框中的removeDialog(int)将强制该活动卸载对话框的所有引用,并在屏幕显示时将其从屏幕中解除。

创build对话框
活动#removeDialog(int)的

看一下onPrepareDialog方法,在显示对话框之前调用它。 在那里您可以根据请求types更改所需的值。

带dateselect器的示例

 @Override protected Dialog onCreateDialog(final int id) { switch (id) { case DIALOG_DATE_ID: final Calendar c = Calendar.getInstance(); return new DatePickerDialog(this, this, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH)); default: return super.onCreateDialog(id); } } @Override protected void onPrepareDialog(final int id, final Dialog dialog) { switch (id) { case DIALOG_DATE_ID: //update to current time final Calendar c = Calendar.getInstance(); ((DatePickerDialog) dialog).updateDate(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH)); break; } } 

这是这个问题的一个重复 : Android:无法更改AlertDialog中出现的文本

你也可以这样做: http : //andmobidev.blogspot.com/2010/03/modifying-alert-dialogs-list-items.html

似乎减慢了longpress菜单的显示,尽pipe…

我想我有一个解决上述不一致的行为。 当最初创build对话框(当它仍然是一个AlertDialog.Builder时),你必须将消息设置为初始状态(非空)或onPrepareDialog不会覆盖预期的值。 所以当你创build对话框的时候,做这样的事情总是在消息中有一个非空的值。 我苦苦挣扎了好几天,偶然发现了这个解决scheme:

 AlertDialog.Builder resultAlert = new AlertDialog.Builder(context); if ( message == null ) { resultAlert.setMessage(""); } else { resultAlert.setMessage(message); } 

我理解使用活动pipe理对话的性能原因,但是会build议除了简单的情况外,不要使用它们。 原因是:

  1. Bundle参数只在API Level 8中添加,所以不能用于向后兼容。 这实际上意味着'onPrepareDialog'需要依赖非局部variables来区别状态;

  2. 实践表明,对“onPrepareDialog”主体中所做的任何对话更改作出响应的行为都很差且不一致。

如果根据需要对话框进行分类和创build,则不会出现这些问题。 如果需要,可以调用“setOwnerActivity”。

当你有一个自定义的对话框,你可以通过使用dialog.getWindow()。findViewById(…)

本示例保存最后显示的文本,并在下次显示对话框时再次显示。

 // custom dialog final Dialog dialog = new Dialog(this); dialog.setContentView(R.layout.customized); dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialogInterface) { EditText dialogText = (EditText)dialog.getWindow().findViewById(R.id.customText); savedText = dialogText.getText(); } }); dialog.show(); EditText dialogText = (EditText)dialog.getWindow().findViewById(R.id.customText); dialogText.setText(savedText); 

自定义对话框的xml:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/buttonOK" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="OK" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginBottom="16dp" /> <EditText android:id="@+id/customText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="19dp" android:hint="Message" android:ems="10" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" /> 

我有一个想法,但不是很好。* 这是用户不使用对话很频繁! *解决scheme:首先,你应该声明一个variables(inttypes),并使默认值为0.例如private int i=0; 并且在使用Activity的showDialog方法之前,增加intvariablesi并将值i作为showDialog方法的参数。 代码可能会这样

 private int i=0; //before you show the dialog this.i++; this.showDialog(this.i); 

究竟。 对于AlertDialog,它是用Builder.create()创build的, onPrepareDialog()是无用的。 生成器是单向的,一旦创build对话框,就不能更新。 我的意思是不能松散,我相信你可以得到一个处理视图,手动做这一切,但是这首先打败了使用build设者的观点。

我发现唯一的解决scheme是手动创build/显示/closures对话框,而不是使用onCreateDialog()showDialog()等我试图调用removeDialog() ,但似乎并没有工作。