首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Fragment嵌套ViewPager必須使用getChildFragmentManager()的原因

     編輯:程式設計綜合問答

問題現象

在 Fragment 內部使用 `ViewPager` + `FragmentPagerAdapter` 時,若傳遞 `getFragmentManager()` (或 `getSupportFragmentManager()`),會導致:

  • 頁面不顯示 / 空白
  • 翻頁後 Fragment 狀態異常
  • 嵌套 Fragment 生命周期混亂

根本原因

**Fragment 管理器是分層的**:

  • **Activity 級** `FragmentManager`:管理直接掛在 Activity 下的 Fragment。
  • **Fragment 級** `ChildFragmentManager`:管理**該 Fragment 內部嵌套的子 Fragment**。

`ViewPager` 的適配器需要一個 `FragmentManager` 來實例化、附加、分離頁面 Fragment。若給父級管理器,它會嘗試在 Activity 視圖層級操作子 Fragment,**找不到容器視圖**,導致失敗。

正確代碼


public class ParentFragment extends Fragment {
    private ViewPager viewPager;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_parent, container, false);
        viewPager = view.findViewById(R.id.viewPager);
        // 關鍵:使用 getChildFragmentManager()
        viewPager.setAdapter(new MyPagerAdapter(getChildFragmentManager()));
        return view;
    }

    private static class MyPagerAdapter extends FragmentPagerAdapter {
        public MyPagerAdapter(FragmentManager fm) {
            super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
        }
        @NonNull @Override public Fragment getItem(int position) { return ChildFragment.newInstance(position); }
        @Override public int getCount() { return 3; }
    }
}

版本兼容提示

  • **AndroidX (推薦)**:`getChildFragmentManager()` 返回 `androidx.fragment.app.FragmentManager`。
  • **舊版 Support Library**:同樣調用 `getChildFragmentManager()`。
  • **嵌套深度 > 2** 時,每層 Fragment 都必須用自己的 `getChildFragmentManager()` 給內層 ViewPager。

總結

**凡是 Fragment 裡套 ViewPager (或 Fragment 容器),適配器構造器必須傳 `getChildFragmentManager()`**。這是 Fragment 嵌套機制的強制要求,否則子 Fragment 無法正確附加到父 Fragment 的視圖層級中。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved