2009-05-07 3 views
5

Сегодня я столкнулся с очень странной проблемой. В моей игре я создаю AlertDialog, чтобы показать пользователям проблемы следующего уровня, когда это удается. Таким образом, соответствующий код выглядит следующим образом. когда игра выполнена успешно, showDialog (R.id.display_success) вызывается и выполняется следующий код.Android: не удается изменить текст в AlertDialog

Итак, я ожидаю выполнить этот код в каждом вызове. Однако; игра выполняется только один раз и показывает один и тот же AlertDialog в каждом другом исполнении. Я имею в виду, что экземпляр не создается после создания первого и первый экземпляр используется все время. Надеюсь, я смог описать свою проблему.

case R.id.display_success:   
     updateGameSettings(); 
     message = formatLevel() 
     + formatMission(); 
     return new AlertDialog.Builder(this) 
     .setIcon(R.drawable.smiley_happy) 
     .setTitle(R.string.dialog_success) 
     .setMessage(message) 
     .setPositiveButton(R.string.alert_dialog_newgame, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog,  int whichButton) { 
         startANewGame(); 
       } 
     }) 
     .setNegativeButton(R.string.exit, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int whichButton) { 
        finish(); 
       } 
     }) 
     .create(); 

ответ

3

onPrepareDialog метод вызывается, когда отображается диалог. Таким образом, лучше изменить текст или другие функции, переопределив этот метод.

+1

Я думаю, вы ошибаетесь. По дизайну каждый диалог создается только один раз. Если вы хотите изменить содержимое своего диалогового окна, используйте onPrepareDialog, который вызывается каждый раз, когда ваш диалог вот-вот появится. Предоставленный код может работать, но это не лучший способ сделать это. –

+0

Я положил 'removeDialog' в инструкцию try catch. Код работает, но я очень сомневаюсь, что это правильный способ сделать это. –

+0

@ Тит, да, я ошибаюсь. Я узнал это намного позже, что onPrepareDialog вызывается каждый раз, когда диалог создается. –

4

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

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

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

Удивительно, что работает! Хотя по какой-то причине это не работает для названия диалога ... – matt

Смежные вопросы