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

Kotlin向LinearLayout动态添加带weight的View不生效问题求助

问题根因

  • 布局参数类型不匹配:父容器为LinearLayoutCompat,但子View使用了原生LinearLayout.LayoutParams,参数类型不匹配导致weight属性被系统忽略
  • LayoutParams实例复用错误:同一个LayoutParams实例被所有子View共享,参数会被后续添加的子View覆盖,也会导致属性失效

修复方案

修改Activity中的初始化逻辑,每个子View单独创建LinearLayoutCompat.LayoutParams实例即可,完整修正代码如下:

class MainActivity : AppCompatActivity() {
    private var barsIndex = BooleanArray(30) { false }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val viewBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(viewBinding.root)

        viewBinding.barsContainer.weightSum = barsIndex.size.toFloat()
        for (index in barsIndex.indices) {
            val barView = View(this)
            // 每个子View单独创建LinearLayoutCompat专属布局参数
            val layoutParams = LinearLayoutCompat.LayoutParams(
                0, // 宽度设为0配合weight生效
                dpToPx(80), // 80dp转成实际像素,适配不同分辨率
                1f // weight设为1,所有子View等宽
            )
            // 需要设置margin可取消注释下面这行,示例是左右各2dp间距
            // layoutParams.setMargins(dpToPx(2), 0, dpToPx(2), 0)
            barView.setBackgroundColor(Color.parseColor("#FFFFFF"))
            barView.layoutParams = layoutParams
            viewBinding.barsContainer.addView(barView)
        }
    }

    // dp转像素工具方法,避免硬编码像素值导致不同设备显示不一致
    private fun dpToPx(dp: Int): Int {
        return TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_DIP,
            dp.toFloat(),
            resources.displayMetrics
        ).toInt()
    }
}

额外注意事项

如果还是出现显示异常,可以检查下LinearLayoutCompat的宽度是否确实为match_parent,如果父容器给的宽度是wrap_content,weight分配也会失效。

内容的提问来源于stack exchange,提问作者Arman Momeni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:06:02