wrap_content在Android按钮高度中无效

22

"wrap_content"在我的按钮中不起作用,它目前的外观是这样的:

 now                        want
 ____________
|            |           _____________
|   aaaaaa   |     =>   | aaaaaaaaaaa |
|____________|           -------------

我的按钮的XML代码:

 <Button 
     android:layout_gravity="center"
     android:id="@+id/input_expend"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"                               
     android:textSize="12sp"
     android:text="aaaaaaa"                         
     android:background="@drawable/btn_01"/>
 <Button 
     android:layout_gravity="center"
     android:id="@+id/input_expend"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"                               
     android:textSize="12sp"
     android:text="aaaaaaa"                         
     android:background="@drawable/btn_02"/> 

我该如何解决这个问题? 谢谢!


3
也许是您的可绘制对象添加了额外的填充! - antoniom
2
另外,你的 android:id= 对于这两个按钮来说是相同的吗? - Shobhit Puri
6个回答

58

Button是一个View,并且android:minHeight属性默认设置为48dip。您可以将minHeight设置为低于实际文本'aaaaa'的高度,例如1dp。然后wrap_content就会起作用。但我认为这不是推荐的做法。


1
绝对不建议这样做。 按钮具有最小高度和最小宽度,以使用户更容易触摸并不会错过它。它还应该始终具有边距,以便用户不会点击其侧面的按钮。请阅读Material Design指南。https://material.io/guidelines/components/buttons.html#buttons-style - Vitor Hugo Schwaab
您还应该尝试使用btn.setMinHeight(0)或btn.setMinimumHeight(0),或者两者都使用。 - Tincho825
你能指出关于Button minHeight、minWidth的Android文档吗? - Jeff Padgett
1
它对我起作用了。我认为将minHeightminWidth设置为比默认值小一点是可以的。我将这两个值都设置为40dp和80dp。 - mazend

1
更改背景和padding="@null"都没有生效。最终我使用了TextView,因为我的按钮足够简单,可以满足需求:
<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Join"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:padding="5dp"
        android:textSize="@dimen/xsmall_text_size"
        android:textColor="@drawable/button_text_selector"
        android:background="@color/turquoise"
        android:textStyle="bold"
        android:onClick="buttonOnClick"
        android:clickable="true"/>

1

一种解决方法是在XML中添加android:padding="@null"到按钮中。这将覆盖任何现有的填充强制执行。

我也遇到了一个问题,即按钮不会缩小到小于默认按钮样式中定义的填充。我曾在我的问题中强调过,但至今没有解决它的答案。


0

wrap_content不能将按钮缩小到比背景更小。如果您已经在使用九宫格作为背景,请将区域的大小减小到最小。如果没有渐变,那么您只需要大约两个像素来定义可伸展区域,然后确保中心区域尽可能小。使用padding(在九宫格上的右侧和底部线)来分配填充。

如果您正在使用可绘制图像(而不是九宫格或xml绘制),则将其制作为九宫格可绘制图像

如果您不想在图像中解决问题,则需要将layout_height设置为固定值以强制图像缩小(即不要使用wrap_content)


0

背景添加了不必要的填充


0

仅添加minHeight是不起作用的。 您还需要将verticalPadding设置为0dp

<Button
        android:id="@+id/button1"
        style="@style/Widget.MaterialComponents.Button.TextButton"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minHeight="1dp"
        android:paddingVertical="0dp"
        android:textSize="14sp"
        android:text="Login"/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接