今天要講的是一個精彩的複雜三角習題關係
主角有以下幾個
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
全站分類:
數位生活
上一篇:
Android 介紹 Profiler,效能優化,多執行緒下載 & 上傳 60 張大圖 multiple threads networking 』Willy's Fish教學筆記
下一篇:
Android Kotlin 解決 Gradle DSL method not found: 'kapt()'』Willy's Fish教學筆記
程式設計 (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)