Android - Как отменить все диалоги в onPause
У меня есть активность, которая может показывать разные диалоги во время выполнения. Я использую onCreateDialog (int id) для создания каждого диалога, и я использую showDialog (int id) и showDialog (int id) метод show и отклоняю каждое диалоговое окно соответственно.
Когда вызывается onPause(), я не знаю, какой диалог (если есть) отображается. Я хочу убедиться, что когда вызывается onPause, все диалоги уменьшаются. Есть ли рекомендуемый способ отклонить все диалоги? Должен ли я вызвать функцию dispDialog() для каждого диалога?
Ответы
Ответ 1
В зависимости от того, сколько диалогов мы говорим. Короткий ответ - да, вам придется отклонить каждый диалог.
Там могут быть элегантные способы сделать это иначе, чем просто иметь несколько диалогов, объявленных на уровне активности. Вы можете сохранить все диалоги в HashMap после их объявления, а затем выполнить итерацию по списку и закрыть каждый из них в режиме Pause.
Поскольку вы не знаете, какие из них открыты, вам нужно пройти и проверить или отслеживать состояния.
Однако, если у вас действительно есть много диалогов на вашем экране, у вас могут возникнуть проблемы с дизайном UI/UX, поскольку Android должен дать вам модель, которая упростит ее реализацию без того, что кажется плохим дизайном.
Ответ 2
Если вы используете 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);
}
}
Ответ 3
С андроидным недавним акцентом на использование диалогового окна
Ответ 4
У меня есть другое решение, это может быть хорошо. Вы только установили расширение Custom Dialog на этот SiblingDialog
, который будет подписывать ваш Dialog
на событие закрытия диалоговых окон. Таким образом, вы можете отправить событие трансляции куда угодно, и все SiblingDialogs
будут закрыты.
В этом примере метод диалога отмены и отклонения был переопределен, поэтому сам SiblingDialog
закрывает каждый второй Sibling при закрытии.
public class SiblingDialog extends Dialog {
protected LocalBroadcastManager mLocalBroadcastManager;
protected BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
switch (intent.getAction()) {
case "CLOSE_ALL_DIALOGS":
if (isShowing()) {
dismiss();
}
break;
default:
break;
}
}
};
String[] ACTIONS_LIST = {"CLOSE_ALL_DIALOGS"};
public SiblingDialog(Context context) {
super(context);
}
public SiblingDialog(Context context, int themeResId) {
super(context, themeResId);
}
public SiblingDialog(Context context, boolean cancelable, OnCancelListener cancelListener) {
super(context, cancelable, cancelListener);
}
private void registerTheBroadCast() {
mLocalBroadcastManager = LocalBroadcastManager.getInstance(getContext());
IntentFilter mIntentFilter = new IntentFilter();
for (String actions : ACTIONS_LIST) {
mIntentFilter.addAction(actions);
}
mLocalBroadcastManager.registerReceiver(mBroadcastReceiver, mIntentFilter);
}
private void unregisterBroadCast() {
mLocalBroadcastManager.unregisterReceiver(mBroadcastReceiver);
}
@Override
public void show() {
registerTheBroadCast();
super.show();
}
@Override
public void cancel() {
unregisterBroadCast();
mLocalBroadcastManager.sendBroadcast(newIntent("CLOSE_ALL_DIALOGS"));
super.cancel();
}
@Override
public void dismiss() {
unregisterBroadCast();
mLocalBroadcastManager.sendBroadcast(new Intent("CLOSE_ALL_DIALOGS"));
super.dismiss();
}
}
Ответ 5
**
public static void dismissAllDialogs(FragmentManager manager) {
List<Fragment> fragments = manager.getFragments();
if (fragments == null)
return;
for (Fragment fragment : fragments) {
if (fragment instanceof BottomSheetDialogFragment) {
BottomSheetDialogFragment dialogFragment = (BottomSheetDialogFragment) fragment;
dialogFragment.dismiss();
}
}
}
**