Android MaterialButton设置垂直内边距为0后仍有多余垂直空间如何解决?
问题复现代码
<com.google.android.material.button.MaterialButton android:layout_width="wrap_content" android:layout_height="40dp" android:text="nice" android:paddingVertical="0dp" android:textColor="@color/light_grey" app:strokeWidth="2dp" app:strokeColor="@color/light_grey" app:cornerRadius="10dp" android:backgroundTint="@color/white"/>
问题现象
上述代码定义的按钮内部存在不受padding属性控制的垂直空隙,导致按钮实际绘制的有效显示高度小于设定的40dp,当前场景不允许通过抬高按钮总高度的方式解决该问题。
问题原因
这类非预期空隙并非paddingVertical属性导致,而是来自MaterialButton组件的内置默认规则:
- 组件默认设置
android:minHeight="48dp",该属性会参与View测量流程,干扰内部绘制区域的位置计算 - 组件默认配置了上下方向的inset间距(
insetTop/insetBottom),该类间距独立于普通padding属性,会直接压缩内部可绘制的有效区域 - 文字排版默认开启字体预留内边距,自带行高的上下留白会进一步缩小有效显示范围
解决方法
无需调整按钮的总高度数值,在原有配置基础上补充对应属性即可完全消除非预期垂直空隙:
- 关闭组件默认最小高度约束:设置
android:minHeight="0dp" - 清除组件默认的上下inset间距:设置
android:insetTop="0dp"、android:insetBottom="0dp" - 移除文字自带的上下字体预留边距:设置
android:includeFontPadding="false"
调整完成后的参考代码:
<com.google.android.material.button.MaterialButton android:layout_width="wrap_content" android:layout_height="40dp" android:text="nice" android:paddingVertical="0dp" android:minHeight="0dp" android:insetTop="0dp" android:insetBottom="0dp" android:includeFontPadding="false" android:textColor="@color/light_grey" app:strokeWidth="2dp" app:strokeColor="@color/light_grey" app:cornerRadius="10dp" android:backgroundTint="@color/white"/>
内容的提问来源于stack exchange,提问作者Maximilian Dietel
相关产品推荐
相关产品推荐

