¿Cómo eliminar el relleno alrededor de los botones en Android?

184

En mi aplicación de Android, tengo este diseño:

<?xml version="1.0" encoding="utf-8" ?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical">

    <fragment
         android:id="@+id/map"
         android:layout_width="match_parent"
         android:layout_height="0dp" 
         android:layout_weight="1" 
         class="com.google.android.gms.maps.SupportMapFragment"/>

    <Button
        android:id="@+id/button_back"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="CloseActivity"
        android:padding="0dp"
        android:text="@+string/back" />

</LinearLayout>

En la vista previa y en el teléfono, se ve así:

Como puede ver en el botón en el área inferior, hay algo de relleno allí.

¿Cómo puedo deshacerme de eso y dejar que el botón llene completamente el área inferior?

omega
fuente
66
La respuesta de DATerre ha sido correcta durante dos años. ¿Puedes marcarlo así?
JohnnyLambada
1
Esta pregunta requiere edición para tener un mejor título. Se ha convertido en el primer resultado en la Búsqueda de Google, aunque en realidad no responde la pregunta.
SOFe

Respuestas:

435

Para mí, el problema resultó ser minHeight y minWidth en algunos de los temas de Android.

En el elemento Button, agregue:

<Button android:minHeight="0dp" android:minWidth="0dp" ...

O en el estilo de tu botón:

<item name="android:minHeight">0dp</item>
<item name="android:minWidth">0dp</item>
DA Terre
fuente
55
Tomó un tiempo hasta que me di cuenta de que no estoy lidiando con un comportamiento extraño de relleno, sino más bien minHeight.
Pijusn
77
No creo que esta respuesta realmente responda a la pregunta original en absoluto. Pero todavía me alegro de haberlo encontrado porque no podía entender por qué mi Buttontodavía ocupaba tanto espacio incluso después de configurarlo android:background="@null". El hecho de que el Buttonestilo predeterminado del responsable sea responsable es un muy buen consejo.
Tony Chan
Es importante usar android: minHeight = "0dp" android: minWidth = "0dp", y no solo uno de ellos.
Ricardo
Esto elimina la esquina redondeada y el efecto dominó del botón en Android Nougat, ¿alguna idea de qué podría estar causando este comportamiento?
rraallvv
Esta respuesta resolvió un problema con un GridLayout que contenía botones con opciones de tamaño automático en el texto que se volvía loco mientras intentaba que más botones encajaran en filas / columnas. Respuesta simple que me llevó mucho tiempo encontrar ...
Mike Hanafey
72

Mi solución se estableció en 0 las propiedades insetTop e insetBottom.

<android.support.design.button.MaterialButton
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:insetTop="0dp"
        android:insetBottom="0dp"
        android:text="@string/view_video"
        android:textColor="@color/white"/>
sochas
fuente
1
¡Esto es lo que también resolvió el problema para mí! ¡Gracias!
SPM
me está funcionando
Ankit Saini
46

Eso no es relleno, es la sombra alrededor del botón en su fondo dibujable. Crea tu propio fondo y desaparecerá.

Delyan
fuente
66
Yo hice. No desapareció.
hasan
¿Cómo se puede medir su tamaño?
Iman Akbari
Esto es todo, @Behr, cambiando el fondo al color del botón
Ramon
Me acabo de dar cuenta de que mi imagen de fondo tiene un relleno transparente
Fruit
22

Una solución alternativa puede ser tratar de usar -vevalores para márgenes como los siguientes:

<Button
    android:id="@+id/button_back"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:onClick="CloseActivity"
    android:padding="0dp"
    android:layout_marginLeft="-5dip"
    android:layout_marginRight="-5dip"
    android:layout_marginTop="-5dip"
    android:layout_marginBottom="-5dip"
    android:text="@string/back" />

Hará que ese espacio desaparezca. Quiero decir que puedes elegir el dipvalor apropiado , lo que hace que desaparezca. A mí me funcionó. Espero que funcione para ti.

Shobhit Puri
fuente
44
Tendría cuidado al usar esta solución. Lo que hace es ocultar el fondo del botón (borde + sombras) usando márgenes negativos. ¿Qué son los cambios de estilo y el borde + sombra toma más de 5dp? Prefiero usar la solución Delyan / Casey Murray para estar seguro.
lenrok258
Además, los márgenes negativos no son oficialmente compatibles con Android, así que yo también evitaría esto
Tim Kist
14

Para eliminar el relleno alrededor del botón de alternar, necesitamos establecer minWidth y minHeight 0dp.android:minWidth="0dp" android:minHeight="0dp"

  <ToggleButton
        android:id="@+id/toggle_row_notifications"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minWidth="0dp"
        android:minHeight="0dp"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:padding="@dimen/_5sdp"
        android:textOn=""
        android:textOff=""
        android:background="@android:color/transparent"
        android:button="@drawable/toggle_selector"
        />

configura tu archivo dibujable con el atributo de botón como android:button="@drawable/toggle_selector"

Abajo está mi toggle_selecter.xmlarchivo

<?xml version="1.0" encoding="utf-8"?>
     <selector xmlns:android="http://schemas.android.com/apk/res/android">
            <item android:drawable="@drawable/notifications_toggle_on" 
                  android:state_checked="true"/>
            <item android:drawable="@drawable/notifications_toggle_off" 
                  android:state_checked="false"/>
     </selector>
Yashoda Bane
fuente
9

Soy nuevo en Android pero tuve una situación similar. Hice lo que @Delyan sugirió y también usé android: background = "@ null" en el archivo de diseño xml.

Casey Murray
fuente
6

En el conjunto XML del botón android:includeFontPadding="false"

usuario1005462
fuente
6

Tuve el mismo problema y parece que se debe al color de fondo del botón. Intente cambiar el color de fondo a otro color, por ejemplo:

android:background="@color/colorActive"

y ver si funciona. Luego puede definir un estilo si desea que el botón lo use.

Panagiotis
fuente
Esto elimina la capacidad de resaltado / animación del botón.
Altus
6

Para quitar el relleno superior e inferior

<com.google.android.material.button.MaterialButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minHeight="0dp"//to effect the following parameters, this must be added!
        android:insetTop="0dp"
        android:insetBottom="0dp"/>

Para quitar el relleno izquierdo y derecho

<com.google.android.material.button.MaterialButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minWidth="0dp"//to effect the following parameters, this must be added!
        android:insetLeft="0dp"
        android:insetRight="0dp"/>
Ali Rezaiyan
fuente
4

No es un relleno pero o la sombra del fondo dibujable o un problema con el minHeightyminWidth .

Si aún desea el agradable efecto dominó, puede crear su propio estilo de botón usando ?attr/selectableItemBackground:

<style name="Widget.AppTheme.MyCustomButton" parent="Widget.AppCompat.Button.Borderless">
    <item name="android:minHeight">0dp</item>
    <item name="android:minWidth">0dp</item>
    <item name="android:layout_height">48dp</item>
    <item name="android:background">?attr/selectableItemBackground</item>
</style>

Y aplicarlo al botón:

<Button 
    style="@style/Widget.AppTheme.MyCustomButton"
    ... />
Allan Veloso
fuente
2

No parece ser relleno, margen o altura mínima / ancho. Al configurar android:background="@null"el botón pierde su animación táctil, pero resulta que establecer el fondo en cualquier cosa arregla ese borde.


Actualmente estoy trabajando con:

minSdkVersion 19
targetSdkVersion 23
juil
fuente
1

Dele a su botón un fondo personalizado: @ drawable / material_btn_blue

Mike6679
fuente
0

También puedes hacerlo con layout_width(height) parámetros.

Por ejemplo, he eliminado el espacio superior e inferior con android:layout_height="18dp"código.

Max Zonov
fuente
0

Se supone que no se debe usar un botón estándar en todo el ancho, por lo que experimenta esto.

Antecedentes

Si echa un vistazo al Diseño de materiales - Estilo de botón , verá que un botón tiene un área de clic de 48dp de altura, pero se mostrará como 36dp de altura por ... alguna razón.

Este es el contorno de fondo que ve, que no cubrirá toda el área del botón.
Tiene esquinas redondeadas y algo de relleno y se supone que se puede hacer clic solo, envolver su contenido y no abarcar todo el ancho en la parte inferior de la pantalla.

Solución

Como se mencionó anteriormente, lo que quieres es un fondo diferente . No es un botón estándar, sino un fondo para un elemento seleccionable con este agradable efecto dominó.

Para este caso de uso, existe el ?selectableItemBackgroundatributo de tema que puede usar para sus fondos (especialmente en listas).
Agregará una ondulación estándar de la plataforma (o alguna lista de estado de color en <21) y usará los colores de su tema actual.

Para su caso de uso, puede usar lo siguiente:

<Button
    android:id="@+id/sign_in_button"
    style="?android:attr/buttonBarButtonStyle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Login"
    android:background="?attr/selectableItemBackground" />
                   <!--  /\ that's all -->

Tampoco es necesario agregar pesos de diseño si su vista es la única y se extiende por toda la pantalla

Si tiene una idea diferente sobre cómo debería ser su fondo, debe crear un dibujo personalizado y administrar el color y el estado allí.

Esta respuesta copiada de la pregunta: ¿Cómo eliminar correctamente el relleno (o margen) alrededor de los botones en Android?

Mohammad7G
fuente
0

Después de horas de buscar respuestas múltiples, finalmente encontré una solución que no utiliza un elemento diferente, minHeightni manipula minWidth, ni siquiera ajusta Buttona RelativeLayout.

<Button
    android:foreground="?attr/selectableItemBackground"
    android:background="@color/whatever" />

La conclusión principal aquí es la configuración del primer plano en lugar del fondo, ya que muchas de las respuestas estipulan. Cambiar el fondo en sí selectableItemBackgroundsolo sobrescribirá cualquier cambio que haya realizado en el color / fondo del botón, si corresponde.

Cambiar el primer plano te ofrece lo mejor de ambos mundos: deshazte del relleno "invisible" y conserva el diseño de tu botón.

Altus
fuente
0

Puede usar el estilo sin bordes en AppCompatButton como se muestra a continuación. y usa android: fondo con él.

style = "@ style / Widget.AppCompat.Button.Borderless.Colored"

Código de botón

<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" />

Salida:

ingrese la descripción de la imagen aquí

Shihab Uddin
fuente