2012-06-26 2 views
3

Я искал решение, но, похоже, это не обычная проблема.DialogFragment не отклоняется

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

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

void displayDialog(int type, String message) { 
    Log.i(logTag, "displayDialog: " + type); 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog"); 
    if (prev != null) { 
     Log.i(logTag, "removing previous dialog"); 
     ft.remove(prev); //TODO maybe use ((DialogFragment)dialog).dismiss(); ? 
    } 
    ft.addToBackStack(null); 

    // Create and show the dialog. 
    DialogFragment newFragment = DialogHelperFragment.newInstance(type, message); 
    newFragment.show(ft, "dialog"); 
} 

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

displayDialog(DialogHelperFragment.DIALOG_PROGRESS, null); 
displayDialog(DialogHelperFragment.DIALOG_PURCHASE_SUCCESS, null); 

Вот мой соответствующий выход LogCat:

06-25 13:53:35.497: I/tag(11008): displayDialog: 8 
06-25 13:53:35.497: I/tag(11008): displayDialog: 7 
06-25 13:53:35.897: I/tag Dialog Helper(11008): Creating Dialog: 8 
06-25 13:53:35.907: I/tag Dialog Helper(11008): Creating Dialog: 7 

проблема заключается в том, что

Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog"); 

возвращает null, потому что первое диалоговое окно не было создано или не привязано к моменту отображения отображенияDialog().

Любые советы были бы очень полезны.

+0

Просто подумал, что стоит добавить ссылку на это, так как это похоже, но не то же самое: http://stackoverflow.com/ Вопросы/14738572/can not-get-dialogfragment-to-reject-programatically/18187157 # 18187157 – TacB0sS

ответ

6

То, что я искал был

getSupportFragmentManager().executePendingTransactions() 

, как показано here. Кажется, сделка не спешила пройти. Этот вызов переносит транзакцию. Порядок моих транзакций выглядит следующим образом:

06-26 10:45:43.800: I/tag(3303): displayDialog: 8 
06-26 10:45:43.800: I/tag(3303): Previous Dialog Fragment is:null 
06-26 10:45:43.810: I/tag(3303): displayDialog: 7 
06-26 10:45:43.810: I/tag(3303): Previous Dialog Fragment is:DialogHelperFragment{40b44a78 #0 dialogHelp} 
06-26 10:45:43.810: I/tag(3303): removing previous dialog 
06-26 10:45:44.220: I/tag Dialog Helper(3303): Creating Dialog: 7 

так что тип диалога 8 удаляется до его фактического создания.

Надеюсь, это поможет тем, кто застрял в одной и той же проблеме.

Редактировать

Кажется, я также должен был удалить addToBackStack(null)

1

Извините, я действительно не очень внимательно смотрел на ваш код, но я не могу найти вызов «совершить» на вашем FragmentTransaction. Вы должны совершить эти транзакции в конце.

EDIT: Поскольку вы используете DialogFragments, который может управлять транзакцией самостоятельно с показом и увольнением, вы должны использовать это вместо этого.

Однако вам нужно вызвать уклонение от объекта диалога фрагмента.

+0

Из документов Android для DialogFragment.show (FragmentTransaction, String): «Отобразите диалог, добавив фрагмент, используя существующую транзакцию, а затем выполните сделка." Мне кажется, что show() совершает транзакцию для меня. –

+0

Да, вы правы в этом. Я добавил еще одну мысль к моему уже опубликованному ответу, пока вы отвечали. – tiguchi

+0

Вызов функции «Отклонить»() в диалоговом окне сам по себе не сработал для других людей, и общее мнение о других сообщениях SO состояло в том, что лучше вызвать call() на DialogFragment. Это то, что я делаю для моего предупреждения DialogFragments, но неопределенный счетчик должен быть уведомлен о том, когда его увольняют. Как вы предлагаете мне это сделать, если я не могу получить дескриптор фрагмента, когда getSupportFragmentManager(). FindFragmentByTag («dialog»); возвращает null? –

Смежные вопросы