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
相关产品推荐
相关产品推荐

