Мастер, такой как DialogFragment-Chain - PullRequest
2 голосов
/ 04 ноября 2011

Привет, товарищи по разработке Android,

Я пытаюсь сделать два DialogFragment подряд, поэтому, когда первый отменяется, выскакивает второй.

Вот что у меня есть:

В своей деятельности я вызываю следующий метод:

void showFirstDialog() {
        // Pass the context to do a callback
        DialogFragment newFragment = ChangeDialogFragment.newInstance(mContext);
        newFragment.show(getSupportFragmentManager(), "myFirstDialogTag");
    }

В моем DialogFragment у меня есть следующий код, чтобы определить, что он будет отменен:

@Override
    public void onCancel(DialogInterface dialog) {
            // Use Context to do a callback and inform the Activity that
            // Fragment is cancelled
        ((Activity) mContext).firstDialogCanceled();
        super.onCancel(dialog);
    }

Вернувшись в свою деятельность, я реагирую на это событие, открывая второй диалог:

void firstDialogCanceled {
        DialogFragment newFragment = InformationDialogFragment.newInstance();
        newFragment.show(getSupportFragmentManager(), "mySecondDialogTag");
    }

Это прекрасно работает, пока у меня нет изменения ориентации в первом диалоге. Когда он у меня есть, я получаю следующую ошибку:

java.lang.IllegalStateException: невозможно выполнить это действие после onSaveInstanceState

Это исключение возникает в строке "newFragment.show (getSupportFragmentManager ()," mySecondDialogTag ");"

Я подумал, как решить эту проблему, - закрыть первый диалог вручную. Я попробовал следующее:

DialogFragment firstFragment = (DialogFragment) getSupportManager().findFragmentByTag("myFirstDialogTag");
firstFragment.dismiss();

Опять же, без изменения ориентации все работает нормально. Когда у меня меняется ориентация, когда на экране появляется первый диалог, я получаю исключение NullPointerException в строке "firstFragment.dismiss ()".

Почему это происходит? Почему FragmentManager забывает о моем DialogFragment после изменения ориентации и почему я не могу просто показать второй. Ссылки на Android говорят:

вы должны использовать show (FragmentManager, String) или show (FragmentTransaction, String) для добавления экземпляра DialogFragment в ваш пользовательский интерфейс, так как они отслеживают, как DialogFragment должен удалить сам, когда диалог закрывается.

Я действительно использую шоу, но оно все еще не работает должным образом.

Любая подсказка высоко ценится!

Приветствия Ali3n

1 Ответ

2 голосов
/ 25 декабря 2011

Вы используете старый экземпляр действия в вашем фрагменте диалога. Я полагаю, вы передаете текущую активность как mContext в newInstance метод. После изменения конфигурации, такого как ориентация или клавиатура, этот объект контекста становится недействительным и больше не прикрепляется ни к какому окну.

Вы можете использовать getActivity() метод FragmentDialog, чтобы получить текущую активность, в которой он живет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...