MaterialButton(material 1.9.0)setIcon方法失效,setCompoundDrawableWithIntrinsicBounds可用
问题分析
XML设置图标正常,但代码调用setIcon/iconTint无效,核心原因是代码设置时未初始化图标相关的尺寸与布局参数:XML中MaterialButton会自动继承样式里的iconSize、iconPadding等配置,给图标预留显示空间;而直接通过代码赋值icon时,这些参数可能未被正确初始化,导致按钮测量阶段没有为图标分配空间,最终无法显示。
修复方案
在代码中补充图标尺寸、内边距等必要配置,触发按钮正确重绘:
// 先设置图标与 tint xbutton.icon = ResourcesCompat.getDrawable(resources, R.drawable.ic_info, null) xbutton.iconTint = ResourcesCompat.getColorStateList(resources, R.color.orange, null) // 显式配置图标尺寸与内边距(可根据需求调整尺寸值) xbutton.iconSize = resources.getDimensionPixelSize(R.dimen.material_icon_size) xbutton.iconPadding = resources.getDimensionPixelSize(R.dimen.material_icon_padding) // 可选:指定图标位置,确保显示方向正确 xbutton.iconGravity = MaterialButton.ICON_GRAVITY_START // 触发按钮重绘,替代父布局强制刷新 xbutton.invalidate()
关键说明
- 无需手动调用
icon.setVisible(true, true):设置icon后按钮会自动处理可见性,手动提前设置可能干扰初始化流程。 - 优先使用MaterialButton原生API:相比
setCompoundDrawableWithIntrinsicBounds,配置好尺寸参数后,原生iconAPI能更好地兼容Material Design的样式逻辑(如状态变化、主题适配)。
内容的提问来源于stack exchange,提问作者user1743524
相关产品推荐
相关产品推荐

