Android – Как отменить все диалоги в onPause

У меня есть активность, которая может показывать разные диалоги во время выполнения. Я использую onCreateDialog (int id) для создания каждого диалога, и я использую showDialog (int id) и showDialog (int id) метод show и отклоняю каждое диалоговое окно соответственно.

Когда вызывается onPause (), я не знаю, какой диалог (если есть) отображается. Я хочу убедиться, что, когда вызывается onPause, все диалоги уменьшаются. Есть ли рекомендуемый способ отклонить все диалоги? Должен ли я вызвать функцию dispDialog () для каждого диалога?

В зависимости от того, сколько диалогов мы говорим. Короткий ответ – да, вам придется отклонить каждый диалог.

Могут быть элегантные способы сделать это иначе, чем просто иметь несколько диалогов, объявленных на уровне активности. Вы можете сохранить все диалоги в HashMap после их объявления, а затем выполнить итерацию по списку и закрыть каждый из них в режиме Pause.

Поскольку вы не знаете, какие из них открыты, вам нужно пройти и проверить или отслеживать состояния.

Однако, если у вас действительно есть много диалогов на вашем экране, у вас могут возникнуть проблемы с дизайном UI / UX, так как Android должен дать вам модель, которая упростит ее реализацию без плохого дизайна.

Если вы используете DialogFragment и хотите отменить все, что вы можете использовать:

/** * Dismiss all DialogFragments added to given FragmentManager and child fragments */ public static void dismissAllDialogs(FragmentManager manager) { List<Fragment> fragments = manager.getFragments(); if (fragments == null) return; for (Fragment fragment : fragments) { if (fragment instanceof DialogFragment) { DialogFragment dialogFragment = (DialogFragment) fragment; dialogFragment.dismissAllowingStateLoss(); } FragmentManager childFragmentManager = fragment.getChildFragmentManager(); if (childFragmentManager != null) dismissAllDialogs(childFragmentManager); } } 

Учитывая недавний акцент Android на использование контейнера DialogFragment, вам не нужно называть увольнение на каждом

Поскольку в диалоговом окне будет контейнер Fragment, вы можете просто использовать их жизненный цикл . Рассмотрим этот диалог:

 public class FragDialog extends DialogFragment{ public ProgressDialog _dialog; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null) { //this.dismiss(); <-- The dialogs may be dismissed here } } @Override public Dialog onCreateDialog(final Bundle savedInstanceState) { _dialog = new ProgressDialog(getActivity()); return _dialog; } @Override public void onPause() { super.onPause(); // <--------- You may overload onPause } } 

Который вы покажете в своей деятельности с помощью диспетчера фрагментов, обычно вызывающего его следующим образом:

 FragmentManager fm = getSupportFragmentManager(); FragDialog fragDialog = new FragDialog(); fragDialog.show(fm, "my_tag"); 

Обратите внимание, что вы можете фактически изменить то, что делает DialogFragment в onPause. Когда ваша активность вызывает onPause, это onPause также будет вызвано.

Отключение диалога в onPause () с помощью this.dismiss () не будет работать, потому что, как только активность возобновится, он снова возобновит диалог. (Я думаю, это связано с тем, что хранилище хранится до onPause).

Но вы можете смело отклонить диалоговое окно (ы) в onCreate, если вы обнаружите saveInstanceState (резюме), как показано в коде.