设置Button的padding为0后仍存在上下内边距,求助排查原因
我自定义了一个Button控件,已经调用setPadding(0,0,0,0),但按钮依然存在上下内边距,不清楚这个内边距的来源。
相关代码
自定义Button类
class MyButton(context: Context) : Button(context) { fun init() { setBackgroundColor(Color.parseColor("#880808")) // 测试用背景色 text = context.getString(R.string.some_text) setTextColor(ContextCompat.getColor(context, R.color.some_color)) this.setTextSize( TypedValue.COMPLEX_UNIT_DIP, getSizeInDP() ) // 新增修改 isAllCaps = false layoutParams = LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT).also { it.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM) it.setMargins(getMarginSize(), getMarginSize(), getMarginSize(), getMarginSize()) } minWidth = 0 minHeight = 0 setPadding(0, 0, 0, 0) } }
Activity代码
// 原有代码 class SomeActivity() { override fun onCreate(savedInstanceState: Bundle?) { ..... val height = (displayMetrics.heightPixels * 0.15).toInt() val container = RelativeLayout(this) val button = MyButton(this) button.init() container.addView(button) container.setBackgroundColor(Color.TRANSPARENT) val myLayoutParams = createContainerLayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, headerHeight - 30) myLayoutParams.topMargin = 30 container.layoutParams = myLayoutParams ..... } }
问题截图

解决方法
这个内边距是Android系统Button默认的inset(嵌入边距),不属于控件的padding,是系统主题样式给Button添加的额外间距,解决方式如下:
方法一:移除系统默认inset
在自定义Button的构造函数中,清除默认背景带来的inset:class MyButton(context: Context) : Button(context) { init { // 清除默认背景的inset background = ColorDrawable(Color.parseColor("#880808")) } fun init() { // 原有代码不变 } }或者通过代码直接修改inset值:
// 在init方法中添加 (background as? InsetDrawable)?.setInsets(0, 0, 0, 0)方法二:改用AppCompatButton
原生Button的默认样式inset难以调整,换成AppCompatButton后,可通过自定义样式彻底清除:- 自定义样式(styles.xml):
<style name="MyButtonStyle" parent="Widget.AppCompat.Button"> <item name="android:insetTop">0dp</item> <item name="android:insetBottom">0dp</item> <item name="android:padding">0dp</item> </style>- 修改自定义Button继承类:
class MyButton(context: Context) : AppCompatButton(context, null, R.style.MyButtonStyle) { // 原有代码不变 }方法三:直接替换背景Drawable
系统默认Button背景是带inset的StateListDrawable,直接用纯色或自定义Drawable替换:// 在init方法中替换背景 val customBg = ColorDrawable(Color.parseColor("#880808")) background = customBg
内容的提问来源于stack exchange,提问作者enjoinslip
相关产品推荐
相关产品推荐

