Android AlertDialog,每次请求都会动态更改文本

时间:2009-06-05 07:52:50

标签: java android alertdialog

我想显示一个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();
}

8 个答案:

答案 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)会强制活动卸载对话框的所有引用,如果正在显示,则将其从屏幕上解除。

Creating Dialogs
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)

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

  1. Bundle参数仅在API级别8中添加,因此不能用于向后兼容性。这实际上意味着'onPrepareDialog'需要依靠非局部变量来处理状态差异;

  2. 练习表示响应“onPrepareDialog”正文中所做的任何对话框更改时行为不佳且不一致。

  3. 如果将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(),但似乎没有工作

相关问题