需求:在應用每個 Activity 底部顯示相同的 Tab 導航。早期方案使用 TabActivity + ActivityGroup,但兩者均已**棄用**(API 13+)。本文提供基於 **Fragment** 的現代化實現。
採用「單 Activity 容器 + 底部 TabLayout + ViewPager/Fragments」模式,而非多 Activity 嵌套。
<androidx.coordinatorlayout.widget.CoordinatorLayout ...>
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
app:tabMode="fixed"
app:tabGravity="fill" />
</CoordinatorLayout>
public class MainActivity extends AppCompatActivity {
private ViewPager2 viewPager;
private TabLayout tabLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = findViewById(R.id.viewPager); // 或手動創建
tabLayout = findViewById(R.id.tabLayout);
// 適配器
viewPager.setAdapter(new FragmentStateAdapter(this) {
@NonNull @Override
public Fragment createFragment(int position) {
switch (position) {
case 0: return new Tab1Fragment();
case 1: return new Tab2Fragment();
default: return new Tab1Fragment();
}
}
@Override public int getItemCount() { return 2; }
});
// TabLayout 與 ViewPager2 聯動
new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> {
tab.setText(position == 0 ? "Tab1" : "Tab2");
tab.setIcon(position == 0 ? R.drawable.tab1 : R.drawable.tab2);
}).attach();
}
}
每個 Activity 都包含相同的底部佈局,通過 include 復用 XML,邏輯封裝至 BaseActivity:
public class BaseActivity extends AppCompatActivity {
protected BottomNavigationView bottomNav;
@Override
public void setContentView(@LayoutRes int layoutResID) {
// 動態注入底部導航
View root = getLayoutInflater().inflate(R.layout.activity_with_bottom_nav, null);
FrameLayout container = root.findViewById(R.id.content_container);
getLayoutInflater().inflate(layoutResID, container, true);
bottomNav = root.findViewById(R.id.bottom_nav);
setupBottomNav();
super.setContentView(root);
}
private void setupBottomNav() { /* 設置菜單、監聽器、Intent 跳轉 */ }
}
缺點:Activity 切換開銷大、狀態保存複雜、動畫不連貫。
TabActivity、ActivityGroup、多 Activity 模擬 Tab。BottomNavigationView/NavigationBarView)提供現成樣式與行為。擁抱現代架構,構建流暢一致的底部導航體驗。