16

在我小的Android应用程序,我有一个ViewPager 3个页面,每个页面包含一个片段,这是所有工作的罚款与FragmentStatePagerAdapter (见earlier question)。ViewPager包含多个片段一页“java.lang.IllegalArgumentException异常:未找到ID视图”

现在对于大屏幕,我想保持一个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的构造函数,但是提前创建碎片并且有'setRetainInstance(true);'组。

我明白了viewGroup的ID将包含片段should be part of the hierarchy,最后,我想,这是...

如果这有什么差别,我使用的是支持库和SherlockActionBar保持向后兼容旧设备。

如何去这个任何想法?

编辑:我发现,如果我删除onSaveInstanceStateFragmentManager的片段,我没有得到任何崩溃了。所有片段从头这不是我想要的重建,但我想我可能要做到这一点,不知何故后来恢复这些片段....

+1

使用嵌套的片段我的解决办法,我列出了几个方法,帮助您解决原来的问题这里:http://commonsware.com/blog/2012/08/20/multiple-view-viewpager-options.html – CommonsWare

+0

@CommonsWare马克,感谢您的关注:)我实际上阅读过这篇博文。我认为只有第二种方法可行,因为我将页面水平分割。我将再次阅读该页面,看看我是否可以从那里选择一些想法。 – Matthieu

+0

@CommonsWare这些不同的方法都不起作用。最接近的一个是第二个,但它不包括页面中的碎片,只包含简单的小部件...我尝试了所有我能做的并且用尽想法。除非有人真的有一些好主意,否则我不得不以另一种方式解决这个问题。 – Matthieu

回答

18

好吧,即使我搬到做事的另一种方式,我不喜欢把事情不全......

去嵌套片段的方式由Mark的建议。评论中发布的链接转到404,但我找到了关于嵌套片段的example code

有几件事情我已经在路上了解到:

  • 嵌套片段不能有setRetainInstance(true),或者它会得到:

    java.lang.IllegalStateException:无法留住那些fragements嵌套在其他片段中

  • ViewPager的页面中创建FrameLayout来容纳片段是个错误。展望Android的代码(特别是FragmentPagerAdapter),我应该只使用container.getId()找到在哪里添加Fragment。看起来你不能在这个层次上做更复杂的事情,否则它会崩溃。

  • 从我的理解,如果碎片持有的一些信息(像我一样),需要一个很长的时间来加载,不同的方式来处理这个问题是:(?首选方式)

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

无论如何,我被推github

+3

+1为“嵌套片段不能有setRetainInstance(true)” – passsy

相关问题