Dialog.show() vs. Activity.showDialog()

Насколько я могу судить, есть два способа показать диалог из Activity.

  • Создайте диалог (например, с помощью AlertDialog.Builder), а затем вызовите вновь созданный метод Dialog show().
  • Вызвать метод Activity showDialog(), передавая в int, который однозначно определяет, какой тип диалога вы хотите построить. Затем переопределите onCreateDialog(), чтобы создать Dialog, и Android отобразит его для вас.

Второй метод, по-видимому, является стандартной практикой, но мне любопытно, есть ли какая-то причина, какая из них я использую. Здесь все, что я могу придумать:

Причины использования Dialog.show

  • Если вам нужно каким-то образом параметризовать диалог, может быть немного неудобно использовать Activity.showDialog, как описано в этом вопросе. Возможно, вам придется сохранить строку или что-то в переменной-члене, чтобы ее можно было найти позже в течение onCreateDialog или onPrepareDialog.
  • Логика создания и изменения диалогового окна распределяется по нескольким местам, что делает код более трудным для чтения и обслуживания:
    • Место, где вы вызываете showDialog()
    • Внутри потенциально большого оператора switch в переопределенном методе onCreateDialog
    • Внутри потенциально большого выражения switch в переопределенном методе onPrepareDialog

Причины использования Activity.showDialog:

  • В документах API для Activity.showDialog говорится, что диалог "управляется" с помощью Activity, который, я полагаю, дает некоторую выгоду? Но это также верно, если вы используете AlertDialog.Builder, я думаю, потому что вы передаете this в качестве аргумента конструктору Builder.
  • Если ваша активность будет показывать один и тот же (или очень похожий) диалог несколько раз, этот параметр создает его только один раз, вместо того, чтобы создавать новый каждый раз, тем самым уменьшая нагрузку на систему до выделения пространства для новых объектов, сбора мусора и т.д.

Итак, мой вопрос в том, каковы критерии для принятия решения о том, когда использовать Activity.showDialog и когда использовать Dialog.show и почему?

Ответ 1

По-моему, вы должны предпочесть showDialog, потому что этот метод будет выполнять большую часть работы для вас. В примере Вам не нужно беспокоиться о том, что после изменения ориентации экрана вы потеряете ссылку на свое диалоговое окно. Он будет воссоздан автоматически. Dialog.show гораздо более подвержен ошибкам.

Поэтому я предлагаю вам использовать showDialog везде, где вы можете.

Ответ 2

Я думаю, что решение зависит от вас, в зависимости от ваших веских причин. Если у меня есть активность, которая имеет только один диалог (например, для отображения предупреждения), я просто запускаю метод Dialog.show... с другой стороны, если пользовательский интерфейс моего приложения слишком сильно использует его функциональность на использование диалогов было бы гораздо лучше использовать showDialog(). Я думаю, что лучшим преимуществом использования showDialog() является то, что его легче читать:

final int ERROR_DIALOG = 404;
final int MSG_DIALOG = 200;

.....

// if someone else read this, he/she will immediately understand what going on
showDialog( ERROR_DIALOG );

Ответ 3

Вы можете использовать перегруженный метод showDialog(int, Bundle), представленный на уровне API 8.
Просто запустите сообщение, которое будет показано в комплекте, который будет доступен в onPrepareDialog(int, Dialog, Bundle).

Да, я знаю, что showDialog() сам устарел.