現代 Android 推薦 ViewPager2 + FragmentStateAdapter + TabLayout,而非過時的 TabHost。但若維護舊項目必須用 TabHost,核心在於:
TabContentFactory 返回 Fragment 容器(FrameLayout)。FragmentTransaction 替換容器內 Fragment,而非靜態寫死所有子頁佈局。public class MainActivity extends FragmentActivity {
private TabHost tabHost;
private FragmentManager fm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tabHost = findViewById(android.R.id.tabhost);
tabHost.setup();
fm = getSupportFragmentManager();
addTab("Tab1", R.id.container1, Fragment1.class);
addTab("Tab2", R.id.container2, Fragment2.class);
// ...
}
private void addTab(String tag, int containerId, Class extends Fragment> clz) {
TabHost.TabSpec spec = tabHost.newTabSpec(tag).setIndicator(tag);
spec.setContent(new TabHost.TabContentFactory() {
@Override
public View createTabContent(String tag) {
FrameLayout fl = new FrameLayout(MainActivity.this);
fl.setId(containerId);
return fl;
}
});
tabHost.addTab(spec);
// 監聽切換,動態替換 Fragment
tabHost.setOnTabChangedListener(tabTag -> {
FragmentTransaction ft = fm.beginTransaction();
// 隱藏所有、顯示目標(或 replace)
ft.replace(containerId, Fragment.instantiate(this, clz.getName()));
ft.commit();
});
// 首次手動觸發第一個
if (tabHost.getCurrentTab() == 0) tabHost.setCurrentTab(0);
}
}
// build.gradle
implementation "androidx.viewpager2:viewpager2:1.0.0"
implementation "com.google.android.material:material:1.9.0"
// 布局
// Activity
viewPager.setAdapter(new FragmentStateAdapter(this) {
@NonNull
@Override
public Fragment createFragment(int position) {
return fragments[position]; // 預創建或懶加載
}
@Override
public int getItemCount() { return fragments.length; }
});
new TabLayoutMediator(tabLayout, viewPager, (tab, pos) -> tab.setText(titles[pos])).attach();
setMaxLifecycle)。