如何在Android代码中引入复用布局填充父布局并修改子视图属性
问题根因
你的现有实现存在两处核心问题,对应你遇到的两个异常:
- 使用
LayoutInflater.inflate()时第二个参数传null,会导致子布局XML中定义的所有layout_*属性(包括layout_weight)被系统丢弃,因为这些属性需要依赖父容器的LayoutParams规则才能正确解析,这是权重不生效的直接原因 - 没有接收
inflate方法返回的子视图实例,无法获取子布局内部的TextView控件,自然无法设置文本内容
修正方案
修改setData方法的inflate逻辑,同时补充控件属性设置的代码即可,示例如下:
private fun setData( layoutResList: List<Int>, containerList: List<ViewGroup>, // 新增参数:每个子布局对应的展示文本,顺序和布局、容器列表对应 textList: List<String> ) { layoutResList.forEachIndexed { index, layoutRes -> val parentContainer = containerList[index] // 修正inflate调用:传入父容器作为root,attachToRoot设为false,保留XML里的布局参数 val childView = layoutInflater.inflate(layoutRes, parentContainer, false) // 查找子布局中的TextView val targetTv = childView.findViewById<TextView>(R.id.txt_temp_feels_like) // 设置文本 targetTv.text = textList[index] // 若需要动态修改权重可以加这段,不需要则删除,XML里定义的weight会自动生效 // val layoutParams = targetTv.layoutParams as LinearLayout.LayoutParams // layoutParams.weight = 1.5f // 按需修改权重值 // targetTv.layoutParams = layoutParams // 添加到容器 parentContainer.addView(childView) } }
注意事项
- 传入的
layoutResList、containerList、textList三个列表长度需要保持一致,避免下标越界 - 如果你复用的不同子布局内部控件ID不同,可以根据布局资源ID做分支判断,分别处理不同布局的属性设置
内容的提问来源于stack exchange,提问作者SoulReaver313
相关产品推荐
相关产品推荐

