參考陌陌主介面:底部為主 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
在「附近」對應的 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
}
}
巢狀 Fragment 的適配器必須傳入 getChildFragmentManager(),而非 getFragmentManager() 或 getSupportFragmentManager(),否則會發生 Fragment 狀態丟失、重疊、無法正常銷毀等問題。
底部主 Tab 建議僅用點擊切換,不預載非當前 Fragment,每個 Tab 對應一個獨立 Fragment,透過 FragmentTabHost 的 setOnTabChangedListener 管理顯示/隱藏,避免生命週期混亂。
getParentFragment() 或共用 ViewModelsetOffscreenPageLimit(2) 避免來回銷毀重建此架構清晰分離層級:底層 Tab 控制大模塊,頂層 ViewPager 控制細分頁,符合 Material Design 導航規範,且易於維護擴展。