Fragment嵌套fragment出现的两种错误No view found for id for fragment 与Can not perform this action after onSave

一:错误:java.lang.IllegalArgumentException:No view found for id for fragment


在程序中嵌套使用Fragment,实现Fragment中动态加载新的Fragment。程序初始运行时没问题,但运行中时提示:(锁屏,恢复操作。)

Caused by: java.lang.IllegalArgumentException: No view found for id 0x7f0700d8 for fragment MusicTabFragment{4238eea8 #7 id=0x7f0700d8}

at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:865)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1083)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:635)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1431)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:523)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1178)
at android.app.Activity.performStart(Activity.java:5216)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2073)

... 11 more

 MusicTabFragment是动态嵌入的Fragment。

解决:

Android4.2新API

当您遇到想在一个可复用的动态UI组件里放入另一个可复用的UI组件时,这个方案就非常有用。例如,如果您用ViewPager做了个可左右滑动的Fragment,并占用了大部分屏幕空间,您可以在其中的每个fragment页面中嵌入别的fragment了。 想要实现嵌套Fragment,只需在您想进行嵌入的Fragment中调用getChildFragmentManager() 方法。这样会返回一个FragmentManager,然后您就可以用和在顶层的Acitivity中嵌入fragment一样的方法进行操作了。例如,以下代码在一个现有的Fragment类中加上了另一个Fragment: 
Fragment videoFragment = new VideoPlayerFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.video_fragment, videoFragment).commit();

在嵌套的fragment中,您可以通过调用getParentFragment()方法来获取父fragment的引用。

Android支持库现在也加入了嵌套Fragment支持,因此在Android 1.6及更高版本上,您都可以使用嵌套fragment来进行设计。

注意:不能在fragment中导入一个包含标签的布局文件。嵌套fragment仅支持动态加入fragment。



二:解决IllegalStateException: Can not perform this action after onSaveInstanceState

今天使用Fragment的时候,出现了这个错误 IllegalStateException: Can not perform this action after onSaveInstanceState:

 

  1. E/AndroidRuntime(12747): Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState  
  2.     at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1314)  
  3.     at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1325)  

 

 

是在使用FragmentTransition的 commit方法添加一个Fragment的时候出现的,后来在官网找到了相关的

说明:http://developer.android.com/reference/android/app/FragmentTransaction.html#commitAllowingStateLoss()

 

public abstract int commitAllowingStateLoss ()

Added in API level 11

Like commit() but allows the commit to be executed after an activity‘s state is saved. This is dangerous because the commit can be lost if the activity needs to later be restored from its state, so this should only be used for cases where it is okay for the UI state to change unexpectedly on the user.

大致意思是说我使用的 commit方法是在Activity的onSaveInstanceState()之后调用的,这样会出错,因为

 

onSaveInstanceState方法是在该Activity即将被销毁前调用,来保存Activity数据的,如果在保存玩状态后

再给它添加Fragment就会出错。解决办法就是把commit()方法替换成 commitAllowingStateLoss()就行

文章来自:http://blog.csdn.net/yuanyang5917/article/details/45063111
© 2021 jiaocheng.bubufx.com  联系我们
ICP备案:鲁ICP备09046678号-3