close

今天要講的是一個精彩的複雜三角習題關係

主角有以下幾個

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

 

 


arrow
arrow

    顏澤偉 發表在 痞客邦 留言(0) 人氣()