原本運作是沒甚麼問題,但是當螢幕轉向之後取得的 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);
沒有留言:
張貼留言