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

Android TabHost 全局底部導航實現:ActivityGroup 棄用後的 Fragment 方案

     編輯:程式設計綜合問答

需求:在應用每個 Activity 底部顯示相同的 Tab 導航。早期方案使用 TabActivity + ActivityGroup,但兩者均已**棄用**(API 13+)。本文提供基於 **Fragment** 的現代化實現。

架構設計:Single Activity + Multiple Fragments

採用「單 Activity 容器 + 底部 TabLayout + ViewPager/Fragments」模式,而非多 Activity 嵌套。

核心佈局 (activity_main.xml)

<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>

主 Activity 邏輯

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 結構(不推薦)

每個 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 切換開銷大、狀態保存複雜、動畫不連貫。

總結

  • 首選:Single Activity + Fragments + ViewPager2/Navigation Component。
  • 避免:TabActivity、ActivityGroup、多 Activity 模擬 Tab。
  • Material Design 底部導航組件(BottomNavigationView/NavigationBarView)提供現成樣式與行為。

擁抱現代架構,構建流暢一致的底部導航體驗。

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