我有一個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)
,但大部分仍然會遇到與上面相同的行爲。
對不起,如果我不清楚。嵌套的片段實際上永遠不需要從'MainFragment'中自己更新 - 他們自己處理它們。我需要更新的是*哪些片段將嵌套在MainFragment的佈局中。有大約10個片段的列表供用戶選擇,我需要動態地將它們交換出來。 – pez
啊,我誤解了。通常簡單地添加到片段管理器,就像你一樣,應該在'onResume()'中工作。 (然而,在你的問題中,你有兩個右括號'fragment1))' - 這將是一個語法錯誤 - 這是你的原始代碼?)你可以嘗試的一件事是創建一個Handler並調用Handler的postDelayed方法, fragmentManager添加代碼並延遲100-1000ms。如果可行,這意味着在'onResume()'中添加片段時出現問題。這會讓我感到驚訝,但在某些情況下(例如'ListView'),我也遇到過類似的錯誤,我想我會提到它。 – Laogeodritt