代碼中動態創建 FrameLayout 作為容器,欲將 Fragment 添加進去,但 FragmentTransaction.add(int containerViewId, Fragment) 需要編譯期資源 ID (R.id.xxx),動態 View 無預定義 ID。
// 1. 動態創建容器
FrameLayout container = new FrameLayout(this);
container.setLayoutParams(new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
// 2. 關鍵:生成唯一運行時 ID
int containerId = View.generateViewId(); // API 17+ (Android 4.2+)
container.setId(containerId);
// 3. 將容器加入父佈局(如根 LinearLayout)
rootLayout.addView(container);
// 4. 正常使用 FragmentTransaction
getSupportFragmentManager()
.beginTransaction()
.add(containerId, new MyFragment(), "tag")
.commit();
若 minSdkVersion < 17,可自行維護 ID 計數器:
private static int sNextViewId = 0x7f000000; // 避開 aapt 生成 ID 範圍
public static int generateViewId() {
return sNextViewId++;
}
.add(id, fragment, "unique_tag") 便於後續 findFragmentByTag() 獲取實例。onAttach → onCreate → onCreateView → onViewCreated → onStart → onResume,無需手動調用。fragmentManager.beginTransaction().remove(fragment).commit(),避免洩漏。add(ViewGroup, Fragment) 重載存在 —— **不存在**,所有標準 API 均需 containerViewId。container.getId() 卻未調用 setId() —— 返回 View.NO_ID (-1),事務會拋 IllegalArgumentException。onCreateView 中創建容器並添加 Fragment —— 此時 FragmentManager 可能未就緒,建議在 onViewCreated 或 onActivityCreated 之後操作。