我想显示一个AlertDialog,其中包含一个可能会在每个请求中更改的选项。因此,例如,有时我想显示“添加到联系人”选项,而另一次应该“从联系人中删除”。
我的代码第一次运行,但Android似乎缓存AlertDialog,以便下次不执行onCreateDialog。因此,该选项不再改变。我可以阻止这种缓存,还是只有另一种方法来更改选项?
我正在使用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();
}
答案 0 :(得分:33)
查看在显示对话框之前将调用的onPrepareDialog方法。在那里您可以根据请求类型更改所需的值。
日期选择器示例
@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;
}
}
答案 1 :(得分:19)
您还可以使用Activity的 removeDialog(int)功能。当一个对话框被解除时,Activity基本上存储了对话框的状态(出于我想象的性能原因)。在对话框上调用 removeDialog(int)会强制活动卸载对话框的所有引用,如果正在显示,则将其从屏幕上解除。
答案 2 :(得分:4)
这是这个问题的重复: Android: Can not change the text appears in AlertDialog
你也可以这样做: http://andmobidev.blogspot.com/2010/03/modifying-alert-dialogs-list-items.html
似乎会减慢长按菜单的显示速度......
答案 3 :(得分:4)
我想我已经解决了上面提到的不一致行为。在最初创建对话框时(当它仍然是AlertDialog.Builder时),您必须将消息设置为初始状态(非空)或onPrepareDialog不会使用预期值覆盖它。因此,当您创建对话框时,请执行以下操作以使消息中始终具有非空值。我挣扎了几天,偶然发现了这个解决方案:
AlertDialog.Builder resultAlert = new AlertDialog.Builder(context);
if ( message == null ) {
resultAlert.setMessage("");
} else {
resultAlert.setMessage(message);
}
答案 4 :(得分:1)
我理解使用活动管理对话框的性能原因,但建议除了简单的情况外不使用它们。原因是:
Bundle参数仅在API级别8中添加,因此不能用于向后兼容性。这实际上意味着'onPrepareDialog'需要依靠非局部变量来处理状态差异;
练习表示响应“onPrepareDialog”正文中所做的任何对话框更改时行为不佳且不一致。
如果将Dialogs子类化并根据需要创建,则不会出现这些困难。如有必要,可以调用'setOwnerActivity'。
答案 5 :(得分:0)
当您有自定义对话框时,可以使用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" />
答案 6 :(得分:-1)
我有一个想法,但不太好。* 当用户不经常使用对话框时使用它! *解决方案:首先,你应该声明一个变量(int类型) )并将默认值设为0.,如private int i=0;
在使用Activity的showDialog方法之前,增加int变量i并将值i作为参数发布为showDialog方法。
代码可能喜欢这个
private int i=0;
//before you show the dialog
this.i++;
this.showDialog(this.i);
答案 7 :(得分:-3)
准确。对于使用Builder.create()
创建的AlertDialog,onPrepareDialog()
是无用的。生成器是单向的,一旦创建对话框,就无法更新。我的意思是不能松散,我相信你可以获得视图的处理并手动完成所有操作,但这首先使用构建器失败了。
我发现的唯一解决方案是手动创建/显示/关闭对话框,而不是使用onCreateDialog()
,showDialog()
等。我尝试调用removeDialog()
,但似乎没有工作