繼承 TabActivity(已棄用),底部 Tab 切換時,希望頂部標題欄顯示當前 Tab 的標籤文字,而非固定的 App 名稱。
public class HomeScreen extends TabActivity {
private TabHost mTabHost;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hometabs);
mTabHost = getTabHost();
// ... 添加 Tab 代碼 ...
// 關鍵:監聽 Tab 切換,更新標題
mTabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() {
@Override
public void onTabChanged(String tabId) {
// tabId 即 newTabSpec(tag) 時傳入的 tag
setTitle(tabId); // 直接設置 Activity 標題
}
});
}
}
// 錯誤:重寫 onChildTitleChanged 並嘗試修改 Tab 標籤下的 TextView
public void onChildTitleChanged(Activity childActivity, CharSequence title) {
View tabView = mTabHost.getCurrentTabView();
TextView tv = tabView.findViewById(android.R.id.title);
tv.setText(title); // 這會修改 Tab 標籤文字,而非頂部標題欄
}
onChildTitleChanged 回調發生在**子 Activity 標題變化時**,用於同步修改 Tab 標籤文字(反向操作)。且 getCurrentTabView() 返回的是 Tab 指示器視圖,非頂部標題欄。
// Toolbar 作為 ActionBar
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
TabLayout tabLayout = findViewById(R.id.tabLayout);
ViewPager2 viewPager = findViewById(R.id.viewPager);
viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageSelected(int position) {
TabLayout.Tab tab = tabLayout.getTabAt(position);
if (tab != null) {
getSupportActionBar().setTitle(tab.getText()); // 更新 Toolbar 標題
}
}
});
TabActivity:mTabHost.setOnTabChangedListener(tabId -> setTitle(tabId)) 直接搞定。onChildTitleChanged 去改 Tab 標籤,那是反方向同步。ViewPager2 + TabLayout + Toolbar,架構清晰、支援 Fragment、Material Design 風格。