【问题标题】:Dismiss a DialogFragment (support libraries) while activity is on background gets IllegalStateException在后台活动时关闭 DialogFragment(支持库)获取 IllegalStateException
【发布时间】:2011-12-28 08:50:35
【问题描述】:

在我的应用程序的活动中,我需要在上传内容时显示“正在加载”不可取消的 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 是否不应该像我需要的那样使用或者我应该怎么做?

【问题讨论】:

    标签: android android-fragments dismiss illegalstateexception android-dialogfragment


    【解决方案1】:

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

    我捕获了 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
    
    }
    

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

    【讨论】:

      【解决方案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();
                      }
                  }
          }
      

      【讨论】:

      • 但是我的片段对话框应该是我保留片段的目标(在后台执行工作的那个),我的对话框会将结果传递给我的 ui 片段。我说的对吗?
      • 你这样做只是为了显示等待\加载对话框吗?为什么要使用 onActivityResult?我说的对吗?
      • 是的,我愿意。使用 onActivityResult 我从我的工作片段中获取结果,所以我可以知道上传是否成功。
      猜你喜欢
      • 2019-06-02
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-30
      相关资源
      最近更新 更多