You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 09:48:01