¿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?


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>

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

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á.


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.


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>

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.



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.


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

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

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

1

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


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.


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?


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.


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í

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.