为什么我有时会在隐藏片段时获得堆栈跟踪?

时间:2015-09-30 18:49:11

标签: java android android-fragments android-fragmentactivity

我有一个有内部碎片的片段。

public void hideInnerFragment(String fr_tag) {  
  FragmentTransaction childTransaction = getChildFragmentManager().beginTransaction();  
  MyInnerFragment inner = (MyInnerFragment)   getChildFragmentManager().findFragmentByTag(fr_tag);  
  if(inner != null) {  
      childTransaction.hide(inner);  
      childTransaction.commit();  
    }  
}  

工作正常。 但是我在日志中已经看到过类似下面的堆栈跟踪:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1377)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1395)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:637)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:616)
at com.test.MyParentFragment.hideInnerFragment   

为什么我会这个?当这种情况发生时我还没弄明白。

更新
以防它有帮助/重要:
创建片段时,我启动异步任务来执行长时间运行操作,并根据结果调用内部片段的hide。

2 个答案:

答案 0 :(得分:1)

我猜你从异步任务调用方法“hideInnerFragment”或者在调用onPause()之后调用的东西。

我在上一个应用程序中遇到了类似的问题,我通过在hostactivity中使用公共静态布尔值解决了这个问题。

public HostActivity extends Activity(){
     public static boolean visible = false; // set it to false; 

 public void onResume(){
     visible = true;
 }

 public void onPause(){
     visible = false;
 }

}

然后在你的片段中

public void hideInnerFragment(String fr_tag) 
{ 
  if(HostActivity.visible)
  { 
      FragmentTransaction childTransaction = getChildFragmentManager().beginTransaction();  
      MyInnerFragment inner = (MyInnerFragment)   getChildFragmentManager().findFragmentByTag(fr_tag);  
      if(inner != null) {  
       childTransaction.hide(inner);  
       childTransaction.commit();  
     }  
}

答案 1 :(得分:0)

如果您从FragmentActivity扩展,那么在onResumeFragments()方法中执行与片段事务相关的所有操作。

或者你替换childTransaction.commit();与childTransaction。 commitAllowingStateLoss()。

或者你可以覆盖你的onSaveInstance方法,不要调用它的超级。

所有这一切都发生了,因为支持片段有一个已经报告给Google的错误代码.google.com/p/android/issues/detail?id=23761