2015-07-11 110 views
2

我有一個Fragment,MainFragment,它可以包含兩個,三個或四個嵌套片段。用戶可以在設置中更改將顯示的特定片段。重新膨脹不同的佈局查看同一片段onResume

每個片段數量都有不同的佈局。例如,當用戶選擇三個嵌套片段時使用layout_3

我需要做的是動態更新MainFragment的佈局,以及所述片段將被嵌套在該佈局中,在onResume()一旦用戶從設置回來)。大約有10個片段供用戶選擇,我需要能夠動態地將它們交換出MainFragment

我在做這件事時遇到了麻煩。一旦我從設置中返回,更新佈局/視圖的唯一方法是離開MainFragment,然後再回來(其調用onCreateView())。

下面是我在onCreateView()做初始化佈局的例子(兩個嵌套片段是默認):

mView = mInflater.inflate(R.layout.layout_2, mParent, false); 
getChildFragmentManager().beginTransaction().add(R.id.fragmentContainer1, fragment1).commit(); 
getChildFragmentManager().beginTransaction().add(R.id.fragmentContainer2, fragment2).commit(); 
return view; 

假設然後用戶去設置,並選擇有三個嵌套片段。這是我試過的onResume(),沒有效果:

mView = mInflater.inflate(R.layout.layout_3, mParent, false); 
getChildFragmentManager().beginTransaction().add(R.id.fragmentContainer1, fragment1)).commit(); 
getChildFragmentManager().beginTransaction().add(R.id.fragmentContainer2, fragment2).commit(); 
getChildFragmentManager().beginTransaction().add(R.id.fragmentContainer3, fragment3).commit(); 

我不知道如果我做錯了什麼。理想情況下,我只是強制MainFragment再次呼叫onCreateView(),但沒有任何解決方案似乎可以解決這個問題。

任何想法?謝謝您的幫助。

編輯︰我相信問題是與新的View充氣,而不是更換片段。

例如,假設默認屏幕是layout_4,包含四個片段容器。然後用戶進入設置,取消檢查全部四個默認片段,並選擇三個新片段。在onResume()中,我們嘗試膨脹layout_3,然後添加片段。我認爲layout_3從未膨脹,因爲我的片段容器具有相同的風格id整個佈局(即fragmentContainer1 - fragmentContainer4),前三個片段容器被更新。第四個保持原樣,因爲我認爲我們在layout_3,並沒有嘗試更新它。

此行爲被確認並導致崩潰時用戶試圖增加碎片的數量而不是減少。以上,當用戶從四個片段切換到三個片段時,沒有崩潰,因爲我嘗試更新的所有三個片段容器都存在於layout_4中。但是如果用戶在layout_2中,然後轉到設置以選擇第三個片段,我們會在恢復時嘗試向fragmentContainer3添加一個片段。這導致崩潰,因爲layout_3未能膨脹。

java.lang.RuntimeException: Unable to resume activity

java.lang.IllegalArgumentException: No view found for id 0x7f0c005f

任何想法如何解決這一問題?在onResume()中重撥mView的呼叫似乎沒有任何效果。

編輯2:我試過在充氣後試過呼叫mParent.addView(mView),但大部分仍然會遇到與上面相同的行爲。

回答

0

當您從設置中返回時,應在MainFragment中調用onResume(),隨後調用已加載到MainFragment中的任何嵌套片段。您是否可以在嵌套片段「onResume()」中包含任何更新邏輯,而不是僅在onCreateView()

否則,您可以創建不同的代碼路徑,並把更新邏輯有:使類公共方法fragment1fragment2fragment3,其中包括所有的更新邏輯,並在MainFragment調用這些方法從某處。 (您可以創建一個接口,並讓嵌套的片段類繼承該接口(如果它們是不同的類並且您希望設計更清晰)。

請注意嵌套片段是否已恢復尚未調用當嵌套片段'onResume()尚未被調用時,View對象上的方法可能會產生問題。

+0

對不起,如果我不清楚。嵌套的片段實際上永遠不需要從'MainFragment'中自己更新 - 他們自己處理它們。我需要更新的是*哪些片段將嵌套在MainFragment的佈局中。有大約10個片段的列表供用戶選擇,我需要動態地將它們交換出來。 – pez

+1

啊,我誤解了。通常簡單地添加到片段管理器,就像你一樣,應該在'onResume()'中工作。 (然而,在你的問題中,你有兩個右括號'fragment1))' - 這將是一個語法錯誤 - 這是你的原始代碼?)你可以嘗試的一件事是創建一個Handler並調用Handler的postDelayed方法, fragmentManager添加代碼並延遲100-1000ms。如果可行,這意味着在'onResume()'中添加片段時出現問題。這會讓我感到驚訝,但在某些情況下(例如'ListView'),我也遇到過類似的錯誤,我想我會提到它。 – Laogeodritt