Диалог DialogFrament, появляющийся в неправильном порядке при вызове из фрагмента - PullRequest
0 голосов
/ 07 мая 2011

Я портирую код на Honeycomb, используя библиотеку совместимости.Мой предварительно перенесенный код работает следующим образом: у меня есть действия A, B и диалоги D1 и D2.B имеет обработчик сообщений, получающий сообщения из других мест.

A вызывает B, который в сообщении (1) отображает D1 посредством вызова showDialog.В сообщении (2), если пользователь еще не отклонил D1, он удаляется с помощью следующего кода, а затем отображается D2:

if (D1.isShowing()) {
    D1.dismiss();
}

Это работает нормально.

Для моего перенесенного кодаA загружает фрагмент, FB (содержащий обработчик сообщений), а D1 и D2 теперь происходят из DialogFragment.Я изменил свой код так, чтобы диалоги отображались с помощью:

dlg.show(fragmentManager, tag);

, а проверка выше выполняется с помощью:

if (D1.isVisible()) {
    D1.dismiss();
}

Однако это не работает.Что происходит, сначала показывается D2, а затем, когда показывается D1.Я предполагаю, что это потому, что D1 не виден, когда выполняется вышеупомянутая проверка, и D2 добавляется в верхнюю часть стека, поэтому он появляется первым (onCreateView D2 вызывается перед D1).

Теперь я пробовал разные вещи безрезультатно:

1) Проверьте наглядность, получив диспетчер транзакций и проверив, находится ли D1 в стеке.2) Показать диалог, используя:

FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(0, dlg);
ft.commit();            

или используя замену / удаление вместо добавления

3) При проверке на видимость сделайте следующее:

FragmentManager fm = fragment.getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.remove(fragment.D1tag).ft.commit();          

Сейчас3) выполняет какую-то работу, за исключением случаев, когда это не так, и выдается invalidStateException, потому что фрагмент не найден при определенных обстоятельствах (например, при раннем закрытии диалогов).Я на самом деле думаю об этом совершенно неправильно, и, возможно, деятельность должна контролировать жизненный цикл диалогов?Следует отметить, что для моего предварительного приложения «Соты» B теперь является оберткой, которая загружает FB, поэтому я не хочу дублировать любой код управления жизненным циклом как в A, так и в B.

Заранее спасибо.Питер.

1 Ответ

0 голосов
/ 09 мая 2011

ОК, после ряда тупиков, мне наконец-то удалось получить нужную мне функциональность, реализовав в своем обработчике сообщений следующее, чтобы отправить сообщение в обработчик сообщений фрагмента и используя 'show (... ) ', чтобы показать все диалоги:

new Handler().post(new Runnable() {
    public void run() {
        FragmentManager fm = fragment.getFragmentManager();
        DialogFragment fd = (DialogFragment) fm.findFragmentByTag(d1Tag);
        if (fd != null) {
            fm.beginTransaction().remove(fd).commit();
        }
    }
});
...