3

在我的应用程序的活动中,我需要在上传内容时显示“正在加载”不可取消的 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" );

上传发生在从我的 ui 片段执行的保留片段中(使用 asynctask)。上传完成后,我的 ui Fragment 会在 onActivityResult 上收到通知,当前它会尝试关闭对话框。在过去,它通过在 onActivityResult 上完成的回调来委托解除加载对话框的责任,但它也不起作用。

当我的活动在前台时,我可以关闭此对话框,但在后台时,我得到一个 IllegalStateException:在 onSaveInstaneState 之后无法执行此操作。我尝试使用 onRemove,这不会使我的应用程序崩溃,但也不会隐藏 DialogFragment。我已经在我的 ui Fragment 和我的活动上做了这两件事,但仍然有问题。

我一直在阅读文档,但找不到可以使用的方法。

DialogFragment 不应该像我需要的那样使用还是我应该怎么做?

4

2 回答 2

2

您不需要在 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();
                }
            }
    }
于 2012-02-04T15:32:19.417 回答
2

我只是设法用一个肮脏的解决方法解决了这个问题:

我捕获了 IllegalStateException 并将标志设置为 true,所以当我的 Fragment 回来时,我知道我试图解雇。

//All this code is inside my ui Fragment
@Override
public void onResume() {
    super.onResume();
    final boolean kill = getArguments().getBoolean(ARG_KILL_LOADING, false);
    if ( kill ) {
        final DialogFragment df = ( DialogFragment )
                getFragmentManager().findFragmentByTag( "loading" );
        if ( df != null ) {
            df.dismiss();
        }
    }
}


//Here I got workerfragment result and try to dismiss my DialogFragment
@Override
public void onActivityResult( int requestCode, int resultCode, Intent data ) {

    super.onActivityResult(requestCode, resultCode, data);

    try {
        final DialogFragment df = ( DialogFragment ) getFragmentManager().findFragmentByTag( "loading" );
        if ( df != null ) {
            df.dismiss(); //Let's throw an IllegalStateException if on background!
        }
    } catch( IllegalStateException ex ) {
        //dirty way to avoid crashing while on background:
        //we will ask our ui fragment to dismiss df when ui fragment comes back onResume
        getArguments().putBoolean(ARG_KILL_LOADING, true);
    }

//Do something on ui with workerfragment result

}

但我仍然想知道在背景上关闭 FragmentDialog 的正确方法是什么。我有另一个有同样问题的项目:/

于 2011-11-25T00:22:59.637 回答