Android AlertDialog,每个请求上都有动态变化的文本

2022-09-01 18:19:07

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

答案 1

看看在显示对话框之前将调用的 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;
  }
}

答案 2

您还可以使用活动的 removeDialog(int) 函数。当对话被解除时,活动基本上存储对话的状态(出于我想象的性能原因)。在对话框上调用 removeDialog(int) 会强制活动卸载对话框的所有引用,如果显示对话框,则将其从屏幕中消除。

创建对话框
活动#removeDialog(int)


推荐