主佈局為垂直 LinearLayout,頂部「添加」按鈕、底部「移除」按鈕。點擊「添加」需將 inflater 出的 View **插入兩按鈕之間**,而非追加到底部。
mainLayout.addView(inflatedView); // 永遠加到末尾
<LinearLayout android:id="@+id/mainLayout" android:orientation="vertical" ...>
<Button android:id="@+id/btnAdd" android:text="Add View" />
<FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="wrap_content" />
<Button android:id="@+id/btnRemove" android:text="Remove View" />
</LinearLayout>
// Activity/Fragment
FrameLayout container = findViewById(R.id.container);
Button btnAdd = findViewById(R.id.btnAdd);
btnAdd.setOnClickListener(v -> {
View dynamicView = LayoutInflater.from(this).inflate(R.layout.other_layout, container, false);
container.removeAllViews(); // 單個展示;多個則改用 LinearLayout 容器
container.addView(dynamicView);
});
Button btnRemove = findViewById(R.id.btnRemove);
btnRemove.setOnClickListener(v -> container.removeAllViews());
inflate(layout, parent, false):第三參數 false 表示**不自動 attach 到 parent**,手動控制插入位置。FrameLayout 作為佔位符,佈局高度 wrap_content 隨內容撐開,天然夾在兩按鈕中間。LinearLayout (vertical) 或 RecyclerView。// 添加時
dynamicView.setAlpha(0f);
dynamicView.setTranslationY(-50);
container.addView(dynamicView);
dynamicView.animate().alpha(1f).translationY(0).setDuration(300).start();
// 移除時
View toRemove = container.getChildAt(0);
toRemove.animate().alpha(0f).translationY(-50).setDuration(200).withEndAction(() -> container.removeAllViews()).start();
**「容器佔位 + inflate(..., false) + 手動 addView」** 是在指定位置動態插入 View 的標準模式,比操作索引 addView(view, index) 更穩健、可維護。