Отклонить DialogFragment (библиотеки поддержки), пока активность находится в фоновом режиме, получает IllegalStateException - PullRequest
3 голосов
/ 14 ноября 2011

В действии моего приложения мне нужно показать не загружаемый FragmentDialog «Загрузка», пока что-то загружается.Я показываю это диалоговое окно из обратного вызова в моей текущей деятельности, например:

final FragmentManager fm = getSupportFragmentManager();
final FragmentTransaction ft = fm.beginTransaction();
final Fragment prev = fm.findFragmentByTag( "loading" );
if ( prev != null ) {
    ft.remove(prev);
}
ft.addToBackStack(null);
final DialogFragment df = 
        IndeterminateProgressDialogFragment.newInstance(
        getString( R.string.loading_dialog_sending_data ) );
df.setCancelable( false );
df.show( ft, "loading" );

Загрузка происходит в сохраненном фрагменте (с использованием asynctask), который выполняется из моего фрагмента пользовательского интерфейса.Когда загрузка завершена, мой пользовательский фрагмент информируется о onActivityResult, и в настоящее время он пытается закрыть диалоговое окно.В прошлом он делегировал ответственность за закрытие диалогового окна загрузки с помощью обратного вызова, выполненного на onActivityResult, но он тоже не работает.

Я могу закрыть это диалоговое окно, когда моя деятельность находится на переднем плане, но когда он находится в фоновом режимеЯ получаю IllegalStateException: не могу выполнить это действие после onSaveInstaneState.Я попытался использовать onRemove, и это не приводит к сбою приложения, но также не скрывает DialogFragment.Я сделал обе вещи в своем фрагменте пользовательского интерфейса и в своей деятельности, но проблема все еще остается.

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

Разве DialogFragment не должен использоваться так, как мне нужно, или что мне делать?

Ответы [ 2 ]

2 голосов
/ 04 февраля 2012

Вам не нужно отклонять фрагмент в onActivityResult и ловить исключение.

Просто установите свой флаг в onActivityResult. Я использую статическую переменную.

    public class MyFragment extends DialogFragment {
            private static boolean KILL_FLAG = false;

            @Override
            public Dialog onCreateDialog(Bundle savedInstanceState) {
                KILL_FLAG = false;
            }

            @Override
            public void onActivityResult(int requestCode, int resultCode,
            Intent data) {
                    KILL_FLAG = true;
            }

            @Override
            public void onResume() {
                super.onResume();

                if(KILL_FLAG){
                    dismiss();
                }
            }
    }
2 голосов
/ 25 ноября 2011

Мне только что удалось решить эту проблему с помощью грязного обходного пути:

Я ловлю исключение IllegalStateException и устанавливаю флаг в значение true, поэтому, когда мой фрагмент возвращается, я знаю, что пытался отклонить.

Но мне все еще интересно, как правильно отклонить FragmentDialog, когда он находится на Background.У меня есть другой проект с той же проблемой: /

...