在 Android 早期開發中,ActionBar 搭配 Tab 導航是實現分頁介面的經典方案。雖然現代開發多改用 ViewPager 與 TabLayout,但理解 ActionBar Tab 的運作機制、Fragment 事務管理以及參數傳遞方式,對於維護舊專案或掌握 Android 核心概念仍具重要價值。本文將針對一段典型的 onTabSelected 程式碼,詳細解析 Bundle 傳參的必要性、FragmentTransaction 的正確獲取方式,以及 putInt 參數的具體含義。
@Override
public void onTabSelected(Tab arg0, FragmentTransaction arg1) {
Fragment fragment = new DummyFragment();
Bundle argsBundle = new Bundle();
argsBundle.putInt(DummyFragment.ARG_SELECTION_NUMBER, arg0.getPosition() + 1);
fragment.setArguments(argsBundle);
FragmentTransaction fTransaction = getSupportFragmentManager().beginTransaction();
fTransaction.replace(R.id.container, fragment);
fTransaction.commit();
}
Fragment 的生命週期受系統管理,可能會在配置變更(如螢幕旋轉)時被銷毀並重建。若直接使用建構子或公開欄位傳值,重建後資料會丟失。Bundle 機制類似 Activity 的 Intent Extras,系統會自動保存與恢復 setArguments(Bundle) 設置的資料。Fragment 內部透過 getArguments() 即可安全取得初始化參數,確保資料在生命週期波動中不丟失。
不可行。 FragmentTransaction 是抽象類別,無法直接實例化。必須透過 FragmentManager(或 getSupportFragmentManager())的 beginTransaction() 方法獲取實例。程式碼中 FragmentTransaction fTransaction = getSupportFragmentManager().beginTransaction(); 正是標準做法。
DummyFragment.ARG_SELECTION_NUMBER 是開發者自定的常數字串,作為鍵值對的鍵,用於後續從 Bundle 取值。arg0.getPosition() + 1 取得當前被選中 Tab 的索引(從 0 開始),加 1 後作為業務邏輯所需的頁碼或識別碼傳入 Fragment。Fragment 中可這樣取值:
int pageNum = getArguments().getInt(ARG_SELECTION_NUMBER);
ARG_SELECTION_NUMBER,防止拼寫錯誤導致取值失敗。beginTransaction() 獲取事務實例。onTabSelected 中執行 replace/commit 會立即觸發 Fragment 的建立與顯示,若 Tab 切換頻繁,考慮使用 hide/show 或 ViewPager 的 setOffscreenPageLimit 優化效能。ActionBar Tab 導航雖已非主流,但其核心概念——Fragment 事務管理、Bundle 資料封裝、系統生命週期配合——貫穿 Android 開發始終。掌握這些細節,不僅能解決舊專案維護問題,更能深化對 Android 架構的理解,為後續學習 Jetpack Navigation、Compose 等現代框架打下堅實基礎。