我有一个有内部碎片的片段。
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。
答案 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