今天要講的是一個精彩的複雜三角習題關係
主角有以下幾個
1、父級 Activity 以 NavigationView + DrawerLayout 的方式持有 3 個 Fragments
public class AgentMainActivity extends BaseActivity
2、AssitantFragment 被 AgentMainActivit 所持有
本身還以 TabLayout + ViewPager 的方式持有 2 個 Fragments
class AssistantFragment : BaseFragment()
3、ViewPagerAdapter 利用 AssitantFragment 傳進來的 FragmentManager
來管理 2 個 Fragments
public class ViewPagerAdapter extends FragmentPagerAdapter {
4、AssistantContentFragment 是最後的內容顯示 view,交給 ViewPager 管理
class AssistantContentFragment : BaseFragment() {
事情是這樣的
當第一次載入時 AssistantContentFragment 可以正常的顯示內容
但只要透過 DrawerLayout 的 Item 切換到別的 Fragment 之後
再回到 AssistantFragment 時,AssistantContentFragment 的內容就不會顯示了
一開始我是這樣寫的
adapter.addFragment(
AssistantContentFragment
.newInstance(AssistantContentFragment.STYLE_RESERVE),
getString(R.string.reserve_calls))
分別傳入 Fragment & 要顯示的 Title
但後來發現這樣做的話,每次都會 new 一個新的 instance 出來
Fragment 的狀態就無法保存
因此推測,無法顯示的原因就是資料不存在
所以改成
companion object {
val reserveFragment
= AssistantContentFragment
.newInstance(AssistantContentFragment.STYLE_RESERVE)
val missedCallFragment
= AssistantContentFragment
.newInstance(AssistantContentFragment.STYLE_MISS_CALL)
}
將 Fragment 提出來成為 object 層級
但結果失敗,畫面依舊跑不出來
第二次嘗試,我把問題的根源往 viewpager 推測
因為這個 view 的層級太多
Activity -> Fragment -> ViewPager -> Fragment
所以我就開始懷疑是這裡出了問題
研究一翻後,發現了一個疑點
FragmentPagerAdapter 需要一個 FragmentManager 來管理內容
而這裡我們有三個方式可以在 AssitantFragment 取得 FragmentManager
1、此法已棄用,暫不討論
val adapter = ViewPagerAdapter(activity.fragmentManager)
2、取得 activity 的 FragmentManager
val adapter = ViewPagerAdapter(activity.supportFragmentManager)
3、取得 Fragment 的 Child FragmentManager
val adapter = ViewPagerAdapter(childFragmentManager)
一開始我是用選項 2 的
但我發現,ViewPager 持有的是 AgentMainActivit 的 FragmentManager
這個 Manager 理當是用來管理 AssitantFragment
可我們現在要管裡的應該是 AssistantContentFragment
所以改成選項 3
從 AssitantFragment 再取其子層級的 FragmentManager
這麼一來 ViewPager 取得的 FragmentManager 就是管理 AssistantContentFragment 的 Manager 了
果然,這次切換後顯示正常
這次事件中,我們知道
當遇上 Activity Fragment 包好幾層的時候
要注意各 view 之類的層級關係
否則常常會發生類似的狀況
end
資料來源:
https://medium.com/@dblackker/viewpager-and-tablayout-from-a-fragment-8576e4d22c27