动态设置MaterialCheckBox的marginStart不生效该如何解决?
动态设置MaterialCheckBox起始边距不生效解决方案
核心问题原因
- 父容器为
LinearLayoutCompat,但代码中创建的是LinearLayout.LayoutParams,参数类型不匹配,父容器添加子View时会自动替换为默认LayoutParams,导致设置的边距丢失 setMargins()参数单位为像素(px),直接传入32没有做dp到px的转换,不同分辨率设备显示效果不一致- 仅设置left边距未适配RTL(从右到左)布局场景,建议同时设置marginStart
修复方案
首先添加dp转px的工具方法,保证边距在不同分辨率设备上显示一致:
fun Int.dpToPx(context: Context): Int { return TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, this.toFloat(), context.resources.displayMetrics ).toInt() }
修改动态添加CheckBox的逻辑:
mapOfCategoryFilters.value.forEach { childCategoryItem -> val chkChildCategory = MaterialCheckBox(context) chkChildCategory.setTextColor(ContextCompat.getColor(context, R.color.black)) chkChildCategory.text = childCategoryItem.label // 可选:如果需要消除CheckBox默认的内部左侧留白,添加以下两行 // chkChildCategory.minWidth = 0 // chkChildCategory.setPadding(0, 0, 0, 0) // 使用和父容器匹配的LayoutParams类型 val layoutParams = LinearLayoutCompat.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT ) val startMarginPx = 32.dpToPx(context) layoutParams.setMargins(startMarginPx, 0, 0, 0) layoutParams.marginStart = startMarginPx llCategories.addView(chkChildCategory, layoutParams) }
效果示意图

内容的提问来源于stack exchange,提问作者ant2009
相关产品推荐
相关产品推荐

