TabActivity 設置 OnTabChangeListener,切換到 Language Tab 時嘗試動態添加 View 顯示標籤,但 View 不顯示或狀態不同步。
TabActivity 已棄用 (API 13),內部機制複雜,Tab 內容為嵌套 Activity。inflate + addView 到 FrameLayout 不會觸發子 Activity 生命周期,View 可能被覆蓋或未佈局。WordsClass) 已創建並駐留,切換 Tab 不會重新調用 onCreate,僅走 onResume。// TabActivity 切換時保存狀態
tabHost.setOnTabChangedListener(tabId -> {
SharedPreferences prefs = getSharedPreferences("tab_state", MODE_PRIVATE);
prefs.edit().putBoolean("show_tags", tabId.equals("Language")).apply();
});
// WordsClass (子 Activity) 中
@Override
protected void onResume() {
super.onResume();
SharedPreferences prefs = getSharedPreferences("tab_state", MODE_PRIVATE);
boolean showTags = prefs.getBoolean("show_tags", false);
findViewById(R.id.availabletags).setVisibility(showTags ? View.VISIBLE : View.GONE);
findViewById(R.id.tags).setVisibility(showTags ? View.VISIBLE : View.GONE);
}
// TabActivity 發送
LocalBroadcastManager.getInstance(this).sendBroadcast(
new Intent("TAB_CHANGED").putExtra("tab", tabId));
// 子 Activity 註冊/接收
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override public void onReceive(Context ctx, Intent intent) {
String tab = intent.getStringExtra("tab");
updateUI(tab.equals("Language"));
}
};
@Override protected void onResume() {
super.onResume();
LocalBroadcastManager.getInstance(this).registerReceiver(receiver, new IntentFilter("TAB_CHANGED"));
}
@Override protected void onPause() {
super.onPause();
LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver);
}
// MainActivity
ViewPager vp = findViewById(R.id.viewPager);
vp.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
Fragment[] fragments = {new WordsFragment(), new ActivateFragment(), new SettingsFragment()};
public Fragment getItem(int pos) { return fragments[pos]; }
public int getCount() { return fragments.length; }
public CharSequence getPageTitle(int pos) { return titles[pos]; }
});
TabLayout tabLayout = findViewById(R.id.tabLayout);
tabLayout.setupWithViewPager(vp);
// WordsFragment
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser && isResumed) { // 配合 onResume
loadTagSettings();
}
}
TabActivity + 嵌套 Activity 反模式,極難維護,遇到必重構為 Fragment。onResume/setUserVisibleHint 讀取狀態渲染。拋棄 TabActivity,擁抱 Fragment + ViewPager + TabLayout,Tab 切換響應遷移至子組件生命周期,架構清晰、生命周期正確、維護成本低。