android - 在后台 Activity 时关闭 DialogFragment(支持库)获取 IllegalStateException

标签 android android-fragments dismiss illegalstateexception android-dialogfragment

在我的应用程序的 Activity 中,我需要在上传某些内容时显示“正在加载”不可取消的 FragmentDialog。我在当前 Activity 中通过回调显示此对话框,如下所示:

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 fragment 执行的保留 fragment (使用 asynctask)中。上传完成后,我的 ui fragment 会在 onActivityResult 上收到通知,目前它试图关闭对话框。在过去,它通过在 onActivityResult 上完成的回调来委托(delegate)关闭加载对话框的责任,但它也不起作用。

我可以在我的 Activity 在前台时关闭此对话框,但在后台时我会收到 IllegalStateException:在 onSaveInstaneState 之后无法执行此操作。我尝试使用 onRemove,这不会使我的应用程序崩溃,但也不会隐藏 DialogFragment。我已经在我的 ui fragment 和我的 Activity 上完成了这两项工作,但仍然遇到问题。

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

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

最佳答案

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

我捕获了 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 的正确方法是什么。我有另一个项目有同样的问题:/

关于android - 在后台 Activity 时关闭 DialogFragment(支持库)获取 IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8117221/

相关文章:

android - 显示没有动画的键盘

android - 每个Android进程都有自己的线程吗?

android - 如何创建基本 fragment 以便子 fragment 可以从它们扩展以在 OnCreateView 函数中设置适配器?

java - 如何从 JNI 中的线程内部调用 JAVA 方法

java - 尝试创建 fragment 类

java - 带有 viewpager 的 TabLayout 不能平滑滚动

android - 如何在 fragment 内实现带有标签条的 Viewpager?

iphone - UITextField ResignFirstRespond 在 iPhone 中不起作用?

iOS 13/14 模态视图 Controller 解除检测

ios - 关闭 UITableViewController 时出错