我有一个具有内部 fragment 的 fragment 。
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
为什么我得到这个?我还没有弄清楚什么时候会发生这种情况。
更新:
以防万一它有帮助/重要:
创建 fragment 后,我启动一个异步任务来执行长时间运行的操作,并根据结果调用内部 fragment 的隐藏。
最佳答案
我猜您是从异步任务或调用 onPause() 之后调用的方法调用方法“hideInnerFragment”。
我在上一个应用程序中遇到了类似的问题,我通过在主机 Activity 中使用公共(public)静态 boolean 值解决了这个问题。
public HostActivity extends Activity(){
public static boolean visible = false; // set it to false;
public void onResume(){
visible = true;
}
public void onPause(){
visible = false;
}
}
然后在你的 fragment 中
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();
}
}
关于java - 为什么在隐藏 fragment 时有时会得到堆栈跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32873540/