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

相關問題