Android, onpreparredialog для обновления параметризованной строки не обновляется.

#android

#Android

Вопрос:

Похоже, это не работает. В диалоговых окнах с предупреждениями даже не отображается заголовок или сообщение, если я не установил их в методе onCreateDialog .

 @Override
protected void onPrepareDialog(int id, Dialog dialog) {
    super.onPrepareDialog(id, dialog);

    switch(id) {
    case R.id.catalog_rename_dialog:
        ((AlertDialog) dialog).setTitle(getString(R.string.catalog_rename_prompt, catalogDb.getColumnById(selectedCatalogId, CatalogDbAdapter.KEY_NAME)));
        break;
    case R.id.catalog_delete_dialog:
        ((AlertDialog) dialog).setMessage(getString(R.string.delete_prompt, catalogDb.getColumnById(selectedCatalogId, CatalogDbAdapter.KEY_NAME)));
        break;
    }
}
  

Ответ №1:

Я думаю, что у меня есть исправление для onpreparredialog, не отображающее сообщение, установленное с помощью setMessage . При первоначальном создании диалогового окна (когда это все еще AlertDialog.Builder), вы должны установить сообщение в начальное состояние (не null), иначе onpreparredialog НЕ перезапишет его заданным значением. Поэтому, когда вы создаете диалоговое окно, сделайте что-то вроде этого, чтобы в сообщении всегда было ненулевое значение. Я боролся с этим в течение нескольких дней и случайно нашел это решение:

при первоначальном создании диалогового окна (НЕ в onpreparredialog):

 AlertDialog.Builder resultAlert = new AlertDialog.Builder(context);

if ( message == null ) {
    resultAlert.setMessage("");
} else {
    resultAlert.setMessage(message);
}
  

затем в onpreparredialog вы должны иметь возможность перезаписать значение любой строкой, которую вы хотите, используя dialog.setMessage( yourMessage ). Похоже, это дефект в коде Google (я думаю, они называют это ошибкой.)

Комментарии:

1. Да, это ошибка: code.google.com/p/android/issues/detail?id=6489 . Вы должны инициализировать сообщение с ненулевым значением в onCreateDialog, чтобы setMessage() работал в onpreparredialog.

Ответ №2:

Я думаю, вы путаете поведение create и prepare.

  • onCreateDialog используется для настройки элементов управления, присутствующих в диалоговом окне. Он вызывается один раз.
  • onpreparredialog используется для настройки отображаемых значений. Он вызывается каждый раз, когда отображается диалоговое окно