横向LinearLayout中Button无额外margin却未顶靠顶部的原因问询
顶部边距产生原因
- 你看到的边距不是代码里未配置的margin,是Android主题给Button默认注入的内置属性导致的:
- 所有系统默认主题的Button样式都自带
minHeight配置(通常为48dp,符合无障碍触摸目标要求),你给Button设置layout_height="wrap_content"时,实际高度不会小于这个最小值,就算文本高度远低于48dp也会撑开高度 - 默认Button样式还自带上下内边距(padding)、以及
insetTop/insetBottom额外边距,这类边距不属于padding/margin范畴,是样式层面预留的控件间距,Material主题下默认值通常为6dp - Button内部的文本默认是垂直居中对齐,当Button实际高度大于文本高度时,视觉上就会呈现出顶部有空白边距的效果
- 所有系统默认主题的Button样式都自带
额外设置gravity的原因
横向LinearLayout默认从左上角开始排布子控件的规则是成立的,你产生误解的核心是混淆了两种gravity的作用范围:
- LinearLayout的
android:gravity控制的是子控件在LinearLayout内部的整体对齐,默认确实是左上角对齐,这个逻辑没有问题 - 你设置的是Button自身的
android:gravity,这个属性控制的是Button内部的文本/内容在Button自身绘制区域内的对齐规则,默认值是垂直+水平居中。设置为top之后,只是把Button内部的文本从居中改成了靠顶部对齐,原本Button顶部因minHeight留的空白被文本顶到了最上方,视觉上就实现了顶边对齐的效果,和LinearLayout的布局规则没有冲突。
如果想要彻底去掉Button的默认空白,直接给Button添加以下属性即可:
android:minHeight="0dp" android:insetTop="0dp" android:insetBottom="0dp" android:paddingVertical="0dp"
内容的提问来源于stack exchange,提问作者ClassY
相关产品推荐
相关产品推荐

