如何减少 Android 按钮对象内文本周围的内部填充?

113

按钮示例

目前,我有一个看起来像上面第一张图片的按钮。如何减少按钮内部文本周围的填充(使其更像第二个图像)?

布局宽度和高度设置为:

android:layout_width="match_parent"
android:layout_height="wrap_content"

自定义样式形状具有参数"

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" android:padding="10dp">

其他部分仅为颜色属性和半径值。

只是为了明确,我希望按钮的框架更紧密地贴合“登录”文本。

非常感谢您提供的所有帮助和反馈。谢谢。


1
android:padding="10dp 将10dp的内边距减少到5dp。 - Raghunandan
这与按钮的外部填充有关。我指的是“登录”及其容器的内部填充。谢谢。 - Imran NZ
这篇文章对我很有帮助 - https://dev59.com/gWIk5IYBdhLWcg3wfOOe#19227057 (作者 - @StinePike)从答案中得知-添加 android:includeFontPadding="false" - Mikelis Kaneps
覆盖填充对我行得通。textView.setPadding(0,0,0,0); - M. Usman Khan
4
将"android:minHeight = '0dp'"和"android:minWidth = '0dp'"添加到按钮中,这样应该就可以了。 - viper
正确的问题,错误的答案。这不起作用。android:minHeight="0dp" android:minWidth="0dp" 是有效的。话虽如此,你的答案确实去掉了一小部分,但最小高度/宽度是明显的赢家。 - StarWind0
6个回答

261

我花了很长时间才找到这个,但按钮文本周围的“padding”实际上并不是真正的填充。默认的Widget.Button样式包括一个minHeight属性。更改按钮上的minHeight将允许您按预期调整填充。

<Button
        android:id="@+id/header"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/test"
        android:textColor="@color/black"
        android:minHeight="40dip"/>


<style name="Widget.Holo.Button" parent="Widget.Button">
    <item name="android:background">@android:drawable/btn_default_holo_dark</item>
    <item name="android:textAppearance">?android:attr/textAppearanceMedium</item>
    <item name="android:textColor">@android:color/primary_text_holo_dark</item>
    <item name="android:minHeight">48dip</item>
    <item name="android:minWidth">64dip</item>
</style>

7
我遇到了一个类似的宽度问题。设置android:minWidth="0dp"可以解决,但是对于文本较长的按钮,我需要设置android:paddingRight和android:paddingLeft以防止布局不良。 - Simon Featherstone
我的 Widget.Button 没有最小高度(sdk28) - ror
该属性位于主题按钮上,而不是父级“Widget.Button”上。如果您使用的主题与“holo”不同,则可能位于不同位置。这是“holo”的样式https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/values/styles_holo.xml。 - Steven
1
它仍然具有MaterialButton的填充,高度无关紧要,如果您设置height为48dp和minHeight为48dp,您仍将看到填充,按钮背景高度将小于48dp。 - user924
1
如果设置了 android:insetTop="0dp" android:insetBottom="0dp",那么它将最终移除填充并且背景按钮高度将为48dp。 - user924

22
在材料组件库中,MaterialButton具有默认样式,其中insetBottom和insetTop的值为6dp。您可以在布局中更改它们。
结果为:

在材料组件库中,MaterialButton具有默认样式,其中insetBottominsetTop的值为6dp

您可以在布局中更改它们。

  <com.google.android.material.button.MaterialButton
      android:insetTop="0dp"
      android:insetBottom="0dp"
      ../>

或以某种风格:

 <style name="Button_no_insets" parent="Widget.MaterialComponents.Button"..>
    <item name="android:insetTop">0dp</item>
    <item name="android:insetBottom">0dp</item>
 </style>

输入图像说明输入图像说明


5

尝试在您的自定义shape.xml文件中添加以下内容:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="1dp"
android:padding="1dp">

此外,您可以在按钮的XML文件中进行更改。

android:layout_width="wrap_content"
android:layout_height="wrap_content"

2
如果你读原问题在问什么,这根本不起作用。 - Jeremy

3
如果您想要更小的顶部和底部填充,请使用以下代码:
 android:paddingTop="2dp"
 android:paddingBottom="2dp"

那是为了按钮外部的填充。我想要的效果是让按钮框更紧密地贴合“登录”文本。谢谢。 - Imran NZ
1
那已经是按钮的内部填充了。你可能需要检查在<shape />的父视图中是否添加了像android:paddingandroid:layout_margin这样的行。 - Neoh

1

对于我来说,需要为按钮属性设置以下所有内容

minWidth 
minHeight
paddingHorizontal
paddingVertical
layout wrap_content


  android:paddingVertical="0dp"
  android:paddingHorizontal="0dp"
  android:minHeight="0dp"
  android:minWidth="0dp"
  android:layout_width="wrap_content"

这将删除文本和按钮边框之间的所有空格,如果使用边框,则边框将紧贴文本而没有任何空格。


1
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

0

更新: 如果你想使用Material Button: >

你可以使用style="@style/Widget.MaterialComponents.Button.TextButton"属性,将insetTop和insetBottom设置为0dp。同时设置app:cornerRadius="0dp",以获得与我给出的图片相同的结果。

  <com.google.android.material.button.MaterialButton
        android:id="@+id/btnAddMorePassenger"
        style="@style/Widget.MaterialComponents.Button.TextButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:backgroundTint="@color/primary_variant"
        android:insetTop="0dp"
        android:insetBottom="0dp"
        android:text="@string/add_passenger"
        android:textColor="@color/light"
        android:visibility="visible"
        app:cornerRadius="0dp"
        app:icon="@drawable/ic_profile_24dp"
        app:iconGravity="textStart"
        app:iconTint="@color/light"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/toolbar"
        tools:visibility="visible" />

您可以像下面这样在 AppCompatButton 中使用 无边框 样式。同时,您也可以使用您喜欢的背景颜色。

Widget.AppCompat.Button.Borderless.Colored

按钮代码

<androidx.appcompat.widget.AppCompatButton
        android:id="@+id/button_visa_next"
        android:background="@color/colorPrimary"
        style="@style/Widget.AppCompat.Button.Borderless.Colored"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/spacing_normal"
        android:text="@string/next"
        android:textColor="@color/white"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

输出:

enter image description here


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