Android Kotlin如何动态复制View、修改ID后添加到指定父容器
实现方案
步骤1:抽离公共布局(推荐,复用性更高)
把你需要复制的container_length_0对应的布局单独抽为独立布局文件res/layout/item_length_container.xml,内容如下:
<!-- res/layout/item_length_container.xml --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:dividerPadding="5dp" android:orientation="horizontal"> <Button android:layout_width="55dp" android:layout_height="50dp" android:layout_marginRight="2dp" android:layout_weight="1" android:onClick="handleClickButton" android:text="A" /> <Button android:layout_width="55dp" android:layout_height="50dp" android:layout_marginRight="2dp" android:layout_weight="1" android:onClick="handleClickButton" android:text="B" /> </LinearLayout>
然后修改你的原主布局,用include标签引入这个公共布局替代原来的硬编码布局:
<!-- 原位置替换原来的container_length_0的LinearLayout代码 --> <include android:id="@+id/container_length_0" layout="@layout/item_length_container" android:layout_width="match_parent" android:layout_height="match_parent"/>
步骤2:添加点击复制逻辑
在你的Activity/Fragment中给btn_done设置点击事件,逻辑如下:
// 先找到你要插入新布局的目标LinearLayout,示例id为target_container,替换为你自己的目标容器id val targetContainer = findViewById<LinearLayout>(R.id.target_container) val btnDone = findViewById<Button>(R.id.btn_done) btnDone.setOnClickListener { // 加载新的布局实例,attachToRoot设为false,避免直接挂载到父容器 val newContainer = LayoutInflater.from(this) .inflate(R.layout.item_length_container, targetContainer, false) as LinearLayout // 设置新容器的id // 方案1:动态生成唯一id,适配所有Android版本 newContainer.id = View.generateViewId() // 方案2:如果需要固定id为container_length_1,先在res/values/ids.xml中定义<item type="id" name="container_length_1" />,然后直接赋值 // newContainer.id = R.id.container_length_1 // 可选:给子控件设置tag方便后续区分,避免id重复问题 val index = targetContainer.childCount + 1 newContainer.getChildAt(0).tag = "btn_a_$index" newContainer.getChildAt(1).tag = "btn_b_$index" // 将新容器添加到目标布局 targetContainer.addView(newContainer) }
注意事项
- 不能直接把原
container_length_0实例调用addView添加到新容器,每个View只能绑定一个父容器,直接添加会导致原View从原有位置被移除 - 子控件不要使用固定id,否则多个相同布局会出现id重复,后续查找控件会出现异常,推荐用
tag区分不同实例的子控件
内容的提问来源于stack exchange,提问作者stressedkid
相关产品推荐
相关产品推荐

