一个包含多个片段的页面的ViewPager“java.lang.IllegalArgumentException:没有findid为”

在我的小型Android应用程序中,我有一个3页的ViewPager ,每个页面包含一个片段,这与FragmentStatePagerAdapter一起工作正常(请参阅前面的问题 )。

现在对于更大的屏幕,我想保留一个ViewPager ,但我希望前两个片段在同一个首页。

为此,我实现了自己的PagerAdapter,这是主要工作,我正在尝试解决的唯一问题是当我旋转屏幕,我得到一个错误:

 12-11 16:34:13.526: ERROR/AndroidRuntime(9221): FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start activity ComponentInfo{com.matthieu/com.matthieu.TestActivity}: java.lang.IllegalArgumentException: No view found for id 0x7f030002 (com.matthieu:id/top_fragment) for fragment TestFragment{481a3a98 #0 id=0x7f030002} at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3815) at android.app.ActivityThread.access$2400(ActivityThread.java:125) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2037) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:123) at android.app.ActivityThread.main(ActivityThread.java:4627) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:521) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.IllegalArgumentException: No view found for id 0x7f030002 (com.matthieu:id/top_fragment) for fragment TestFragment{481a3a98 #0 id=0x7f030002} at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:903) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1070) at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1861) at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:547) at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129) at android.app.Activity.performStart(Activity.java:3781) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2636) ... 12 more 

我在GitHub上放置了一个示例代码来模拟我正在做什么(并显示此错误消息)。

我想我有一个问题是因为我在实际应用程序中的碎片,我不能真正有一个static newInstance构造函数,而是提前创build碎片,并有'setRetainInstance(true);' 组。

我知道包含该片段的viewGroup的id 应该是层次结构的一部分 ,并且最终,我猜,它是…

如果它有什么不同,我使用支持库和SherlockActionBar来保持与旧设备的向后兼容性。

任何想法如何去做这个?

编辑 :我发现,如果我从FragmentManager onSaveInstanceState删除FragmentManager ,我没有得到任何崩溃了。 所有的片段都是从头开始重新创build的,这不是我想要的,但是我想我可能必须这样做,稍后再以某种方式恢复这些片段….

Related of "一个包含多个片段的页面的ViewPager“java.lang.IllegalArgumentException:没有findid为”"

好吧,即使我转向另一种做事的方式,我也不想把事情不完整…

像Markbuild议的那样去嵌套Fragments。 张贴在评论链接到404,但我发现你的示例代码嵌套片段。

我在路上学到了一些东西:

  • 嵌套片段不能有setRetainInstance(true) ,否则会得到:

    java.lang.IllegalStateException:不能保留嵌套在其他片段中的分数

  • ViewPager的页面中创build一个FrameLayout来保存片段是一个错误。 查看Android代码(尤其是FragmentPagerAdapter ),我应该使用container.getId()来查找添加Fragment 。 看起来你不能在这个层次上做更复杂的事情,否则会打破。

  • 根据我的理解,如果这些碎片包含了一些需要花很长时间加载的信息(比如我),处理这些碎片的不同方法是:

    • 使用onSaveInstanceState (首选的方式?),但是如果嵌套片段是不可能的。 (空)构造函数将在框架需要时被调用。
    • 使用setRetainInstance(true) ,在这种情况下, savedInstanceBundle总是为null ,但是Fragment(作为Java对象)不会被销毁,它仍然会通过onAttach / onCreateView。
    • find一些其他的方式来保存和恢复你所需要的…

无论如何,我推动我的解决scheme使用github上的嵌套片段