使用 ViewPager + FragmentPagerAdapter 實現分頁切換,頁面能滑動但 Fragment 內容空白,onCreateView 不被呼叫或視圖不顯示。
開發者在 TabsAdapter 中覆寫了 isViewFromObject(View, Object) 並回傳 view == obj。FragmentPagerAdapter 父類已正確實作此方法(比較 Fragment 的 View 與 Object),子類覆寫導致邏輯錯誤,使 ViewPager 無法正確關聯 Fragment 與視圖。
刪除 Adapter 中的 isViewFromObject 覆寫方法,直接繼承父類實作。
public class TabsAdapter extends FragmentPagerAdapter {
private List<CommendFragment> fragments;
public TabsAdapter(FragmentManager fm, List<CommendFragment> list) {
super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); // 推薦傳入行為旗標
this.fragments = list;
}
@Override
public int getCount() {
return fragments.size();
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
// ❌ 刪除這個方法!
// @Override
// public boolean isViewFromObject(View view, Object obj) {
// return view == obj;
// }
}
FragmentStatePagerAdapter:若頁面較多(>3-4),建議改用 FragmentStatePagerAdapter 銷毀不可见 Fragment 釋放記憶體。BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT(API 14+),確保只有當前頁面處於 RESUME 狀態。onViewCreated 或 onResume,避免在 onCreateView 執行耗時操作導致卡頓。ViewPager2 + FragmentStateAdapter,支援垂直滑動、RTL、DiffUtil 動畫。| 錯誤做法 | 正確做法 |
|---|---|
| 覆寫 isViewFromObject 回傳 view == obj | 完全不覆寫,使用父類實作 |
| getItem 每次 new Fragment() | 建構子接收預建 List |
| Fragment 持有大量 Bitmap 導致 OOM | 使用 Glide/Coil 載入圖片,onDestroyView 釋放資源 |
移除錯誤覆寫後,ViewPager 即可正常顯示各 Fragment 內容。