2017年11月17日 星期五

螢幕轉向時 FragmentPagerAdapter 如何處理 fragment

最近在 Android 開發中用到 Fragment、ViewPager 跟 FragmentPagerAdapter 的組合,並且需要在 activity 中取得當前顯示的 fragment,原本的做法是在 getItem method 中將 fragment 用 position 當成 index 儲存起來,之後在繼承 FragmentPagerAdapter 的 class 中新增一個 getFragment(int position) method 取得 fragment

原本運作是沒甚麼問題,但是當螢幕轉向之後取得的 fragment 都變成 null,後來才發現 fragment 會被 FragmentManager 儲存在內部,當螢幕轉向時,並不會重新 create 一個 fragment 實體,而是會重用之前 create 過的 fragment,可以看 FragmentPagerAdapter 的實作




可以看到只有在找不到 fragment 時才會去呼叫 getItem 來 create 出一個 fragment 實體,這樣也解釋了為甚麼 google 範例中在複寫 getItem 時都直接 create 一個 fragment 出來了

不過這樣 getItem 的命名感覺很有問題阿,應該叫 createItem 才對,才不會造成混淆

也因為如此,螢幕轉向時,並沒有呼叫到 getItem,所以我取得的 fragment 都是 null,解決的方法很簡單,不需要自己儲存 fragment,也不需要額外實作 getFragment method,直接呼叫 FragmentPagerAdapter 的 instantiateItem 就可以取得當前顯示的 fragment
Fragment fragment = (Fragment)mPagerAdapter.instantiateItem(mViewPager, position);

沒有留言:

張貼留言