Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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);
    }
}

Ответ 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();
            }
        }
    }

**