添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

主角有以下幾個

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

  • 全站分類: 數位生活
  • 上一篇:
  • 下一篇:
  • 展開分類 程式設計 (14)
  • SVN (1)
  • Python (2)
  • Vue (2)
  • Kotlin (2)
  • React Native (4)
  • 純筆記 (3)
  • iOS (5)
  • Java (3)
  • MySQL (4)
  • Mac (2)
  • Git (8)
  • Linux (3)
  • PHP (5)
  • Android (119)
  • 展開分類 投資理財 (1)
  • 程式人的理財筆記 (1)
  • 展開分類 Meditation 冥想日誌 (1)
  • Meditation 冥想日誌 (2)
  • 未分類文章 (8)
  •