Кто-нибудь смог создать диалоги, которые могут обрабатывать все из следующих требований:
- Сохраняться при изменениях ротации (атрибут android: configChanges не будет использоваться)
- Сохраняется при активации экранной заставки (или переходе на ДОМАШНЮЮ СТРАНИЦУ) и возвращении к занятию
- Отображение одного диалогового окна сразу после закрытия другого.
- Отображение одного диалогового окна сразу после закрытия другого с добавлением поворотов в обоих диалоговых окнах.
Объяснение для двух последовательных диалогов: в одном диалоговом окне отображается вопрос «Вы уверены, что хотите…?».Затем при положительном ответе пользователя выполнить действие и представить результат в диалоговом окне.Это действительно очень распространенная ситуация.
Вот кое-что из того, что я пробовал:
Использование AlertDialog.show () вместо showDialog ().Успешное сохранение состояния (включая действия с кликами) в onSaveInstanceState для чтения его в onCreate.Таким образом, диалоги были воссозданы после поворота.Также не было проблем с отображением двух диалогов подряд, т. Е. Маркеров 2 и 3. Последнее, однако, не сработало.Чтобы не пропустить окно, мне пришлось удалить диалоговое окно в onSaveInstanceState (оно будет удалено в любом случае).Тогда я не нашел способа воссоздать его, когда вернулся после активации заставки на моем телефоне.Кто-то знает, какой код будет вызываться при возврате после заставки?Когда я проверял это, ни onCreate, ни onResume, ни onRestoreInstanceState и т. Д. Не вызывались.
Использование методов showDialog.Это хорошо работает для маркеров 1 и 3, то есть состояние сохраняется во время вращения (если используются статические диалоговые ссылки), а также правильно обрабатывает экранную заставку.Однако пуля 2 проблематична.Либо второе диалоговое окно вообще не хочет отображаться из-за «Окно уже сфокусировано, игнорируя усиление фокуса ...», либо диалоговые окна перепутаны, либо действие первого диалогового окна выполняется без запроса пользователя.Чтобы продемонстрировать некоторые проблемы, я создал код быстрого теста ниже.
Запуск этого тестового кода на эмуляторе и вращение второго диалогового окна приведет к появлению окна утечки, а затем снова отобразится первое диалоговое окно.
main.xml
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Perform action"
android:onClick="performAction" />
public class ShowDialogTest extends Activity {
private static final int DIALOG_QUESTION = 0;
private static final int DIALOG_INFO = 1;
private static AlertDialog questionDialog;
private static AlertDialog infoDialog;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public void onResume() {
super.onResume();
showQuestionDialog();
}
/**
* Button click which will bring the dialogs back up.
*/
public void performAction(View v) {
showQuestionDialog();
}
private void showInfoDialog() {
createInfoDialog();
showDialog(DIALOG_INFO);
}
private void showQuestionDialog() {
createQuestionDialog();
showDialog(DIALOG_QUESTION);
}
private void createInfoDialog() {
infoDialog = new AlertDialog.Builder(this).create();
infoDialog.setTitle("The result");
infoDialog.setMessage("Info about the result of the action");
DialogInterface.OnClickListener onClick1 = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
};
infoDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK", onClick1);
}
private void createQuestionDialog() {
questionDialog = new AlertDialog.Builder(this).create();
questionDialog.setTitle("A Question");
questionDialog.setMessage("Are you sure?");
DialogInterface.OnClickListener onClick = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Do something here ..
// Alert the user about the result
showInfoDialog();
}
};
DialogInterface.OnClickListener onCancelClick = new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
};
questionDialog
.setButton(DialogInterface.BUTTON_POSITIVE, "OK", onClick);
questionDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel",
onCancelClick);
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DIALOG_QUESTION:
return questionDialog;
case DIALOG_INFO:
return infoDialog;
}
// Error case (should be handled better ;)
return new Dialog(this);
}
PS.Причина использования методов диалогового окна создания заключается в том, что Activity должен поместить в диалог пользовательский текст и действия кнопок перед его отображением.Это не показано в коде.DS
Я читал другие посты на форуме и пробовал другие вещи.Пожалуйста, отвечайте, только если вы знаете, как это исправить без создания новых проблем.Вы, конечно, можете добавить предложения в комментарии.
Спасибо за ваше время