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

Ulr*_*ler 25 java android 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();
}
Run Code Online (Sandbox Code Playgroud)

Jaa*_*iim 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 您不需要"findViewById",因为您的对话框是作为参数传递的.如果要使用任何AlertDialog特定方法(如"setMessage"),则必须进行强制转换. (3认同)
  • onPrepareDialog是更新对话框的好地方.但是如何在onPrepareDialog中更改AlertDialogs项?似乎没有任何方法,我找不到与findViewById一起使用的id. (2认同)

And*_*ess 19

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

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

  • 出于性能原因,这个对话框只需要创建一次(这是一个相对昂贵的操作).不会在每次显示时重新创建它,您可以使用onPrepareDialog方法对显示的对话框进行更改,如下一个答案中所述. (9认同)