在 TabActivity 中,從某個 Tab 的按鈕啟動另一個屬於同一 TabHost 的 Activity 時,Tab 標籤列會消失。原因是 startActivity 啟動了新的獨立 Activity,脫離了 TabHost 容器。
private OnClickListener btnListener = new OnClickListener() {
public void onClick(View v) {
Intent edit = new Intent(v.getContext(), RoomEdit.class);
startActivityForResult(edit, 0); // 錯誤:啟動獨立 Activity
TabForConfiguration.spec.setCurrentTab(1); // 無效
}
};
利用 TabHost 的靜態引用,直接切換 Tab,而非啟動新 Activity:
public class TabForConfiguration extends TabActivity {
public static TabHost tabHost; // 靜態引用供外部存取
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tabHost = getTabHost();
// ... 初始化 Tab 代碼 ...
}
}
// 在其他 Activity 或按鈕點擊中切換 Tab
Button btn = findViewById(R.id.btn_switch);
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
TabForConfiguration.tabHost.setCurrentTab(1); // 直接切換到第 2 個 Tab
}
});
tabHost 宣告為 public static,讓其他元件可存取setCurrentTab() 切換Intent.FLAG_ACTIVITY_CLEAR_TOP 並確保在同一 Task注意:TabActivity 已在 API 13 棄用。新專案建議使用:
ViewPager + Fragment + TabLayout(Material Design 標準)BottomNavigationView 配合 Fragment 切換// 現代寫法片段
TabLayout tabLayout = findViewById(R.id.tab_layout);
ViewPager viewPager = findViewById(R.id.view_pager);
viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
@Override public Fragment getItem(int position) { return tabs[position]; }
@Override public int getCount() { return tabs.length; }
});
tabLayout.setupWithViewPager(viewPager);