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

Android 雙層 Tab 實現:FragmentTabHost + ViewPager 嵌套方案

     編輯:程式設計疑難解答

參考陌陌主介面:底部為主 Tab(FragmentTabHost + Fragment),點擊「附近」Tab 時,頂部需再呈現三個可滑動的子導航欄。這是典型的雙層 Tab 巢狀結構。

架構設計

主 Activity
└── FragmentTabHost (底部 4-5 個主 Tab)
    ├── Tab 1: Fragment A
    ├── Tab 2: Fragment B (「附近」)
    │   └── ViewPager (頂部 3 個子 Tab)
    │       ├── Fragment B1
    │       ├── Fragment B2
    │       └── Fragment B3
    ├── Tab 3: Fragment C
    └── Tab 4: Fragment D

關鍵實現要點

1. 子 Fragment 內嵌 ViewPager

在「附近」對應的 Fragment(如 NearbyFragment)的 onCreateView 中初始化 ViewPager + TabLayout(或 PagerTabStrip):

public class NearbyFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_nearby, container, false);
        ViewPager viewPager = view.findViewById(R.id.viewPager);
        TabLayout tabLayout = view.findViewById(R.id.tabLayout);
        
        // 適配器使用 FragmentStatePagerAdapter(支援巢狀 Fragment)
        viewPager.setAdapter(new ChildPagerAdapter(getChildFragmentManager()));
        tabLayout.setupWithViewPager(viewPager);
        return view;
    }
    
    static class ChildPagerAdapter extends FragmentStatePagerAdapter {
        private final String[] titles = {"關注", "附近", "動態"};
        // ... 實現 getItem、getCount、getPageTitle
    }
}

2. 必須使用 getChildFragmentManager()

巢狀 Fragment 的適配器必須傳入 getChildFragmentManager(),而非 getFragmentManager() 或 getSupportFragmentManager(),否則會發生 Fragment 狀態丟失、重疊、無法正常銷毀等問題。

3. 底部 Tab 切換邏輯

底部主 Tab 建議僅用點擊切換,不預載非當前 Fragment,每個 Tab 對應一個獨立 Fragment,透過 FragmentTabHost 的 setOnTabChangedListener 管理顯示/隱藏,避免生命週期混亂。

常見坑點提醒

  • 不要在 XML 靜態宣告巢狀 Fragment,必須動態加入 ViewPager
  • 子 Fragment 若需與父 Fragment 通訊,使用 getParentFragment() 或共用 ViewModel
  • ViewPager 預載頁數 setOffscreenPageLimit(2) 避免來回銷毀重建

此架構清晰分離層級:底層 Tab 控制大模塊,頂層 ViewPager 控制細分頁,符合 Material Design 導航規範,且易於維護擴展。

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