Comment supprimer le rembourrage autour des boutons sous Android?


184

Dans mon application Android, j'ai cette disposition:

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

Dans l'aperçu et sur le téléphone, cela ressemble à:

Comme vous pouvez le voir sur le bouton dans la zone du bas, il y a du rembourrage.

Comment puis-je m'en débarrasser et laisser le bouton remplir complètement la zone inférieure?


6
La réponse de DATerre est correcte depuis deux ans. Pouvez-vous le marquer comme tel?
JohnnyLambada

1
Cette question nécessite une modification pour avoir un meilleur titre. Il est devenu le premier résultat de la recherche Google alors qu'il ne répond pas vraiment à la question.
SOFe

Réponses:


435

Pour moi, le problème s'est avéré être minHeight et minWidth sur certains des thèmes Android.

Sur l'élément Button, ajoutez:

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

Ou dans le style de votre bouton:

<item name="android:minHeight">0dp</item>
<item name="android:minWidth">0dp</item>

5
Il a fallu un certain temps avant de réaliser que je n'ai pas affaire à un comportement de rembourrage étrange mais plutôt à minHeight.
Pijusn

7
Je ne pense pas que cette réponse réponde du tout à la question initiale. Mais je suis toujours content de l'avoir rencontré car je ne pouvais pas comprendre pourquoi mon Buttonprenait encore autant de place même après l'avoir réglé android:background="@null". Le fait que le Buttonstyle par défaut soit responsable est un très bon conseil.
Tony Chan

Il est important d'utiliser à la fois android: minHeight = "0dp" android: minWidth = "0dp", et pas seulement l'un d'entre eux.
Ricardo

Cela supprime le coin arrondi et l'effet d'entraînement du bouton sur Android Nougat, une idée de ce qui pourrait causer ce comportement?
rraallvv

Cette réponse a résolu un problème avec un GridLayout contenant des boutons avec des options autoSize sur le texte devenant fou furieux alors que j'essayais de faire tenir plus de boutons dans des lignes / colonnes. Réponse simple qui m'a mis du temps à trouver ...
Mike Hanafey

73

Ma solution a été définie sur 0 pour les propriétés insetTop et 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
C'est ce qui a résolu le problème pour moi aussi! Merci!
SPM le

ça marche pour moi
Ankit Saini il y a

Merci, cela a fonctionné pour moi
khushbu il y a

46

Ce n'est pas du remplissage, c'est l'ombre autour du bouton dans son arrière-plan dessinable. Créez votre propre arrière-plan et il disparaîtra.


6
J'ai fait. n'a pas disparu.
hasan le

Comment mesurer sa taille?
Iman Akbari

Ça y est, @Behr, changer l'arrière-plan de la couleur du bouton
Ramon

Je viens de réaliser que mon image de fond a un rembourrage transparent
Fruit

22

Une solution de contournement peut être d'essayer d'utiliser des -vevaleurs pour les marges comme suit:

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

Cela fera disparaître cet espace. Je veux dire que vous pouvez choisir la dipvaleur appropriée , ce qui la fait disparaître. Cela a fonctionné pour moi. J'espère que ça marche pour toi.


4
Je serais prudent en utilisant cette solution. Il ne fait que masquer l'arrière-plan du bouton (bordure + ombres) en utilisant des marges négatives. Qu'est-ce que les changements de style et la bordure + l'ombre prend plus de 5dp? Je préférerais utiliser la solution Delyan / Casey Murray pour être du bon côté.
lenrok258

De plus, les marges négatives ne sont pas officiellement prises en charge dans Android, donc j'éviterais moi aussi cela
Tim Kist

14

Pour supprimer le remplissage autour du bouton bascule, nous devons définir minWidth et 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"
        />

définissez votre fichier dessinable sur l'attribut de bouton comme: android:button="@drawable/toggle_selector"

Ci-dessous mon toggle_selecter.xmldossier

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

Je suis nouveau sur Android mais j'ai eu une situation similaire. J'ai fait ce que @Delyan a suggéré et j'ai également utilisé android: background = "@ null" dans le fichier de mise en page xml.



6

J'ai eu le même problème et il semble que ce soit à cause de la couleur de fond du bouton. Essayez de changer la couleur d'arrière-plan en une autre couleur, par exemple:

android:background="@color/colorActive"

et voyez si cela fonctionne. Vous pouvez ensuite définir un style si vous souhaitez que le bouton soit utilisé.


Cela supprime la capacité de surlignage / animation du bouton.
Altus

6

Pour retirer le rembourrage haut et bas

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

Pour supprimer le rembourrage gauche et droit

<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

Ce n'est pas un remplissage mais ou l'ombre de l'arrière-plan dessinable ou un problème avec le minHeightet minWidth.

Si vous voulez toujours le bon effet d'entraînement, vous pouvez créer votre propre style de bouton en utilisant ?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>

Et appliquez-le au bouton:

<Button 
    style="@style/Widget.AppTheme.MyCustomButton"
    ... />

2

Il ne semble pas s'agir de remplissage, de marge ou de hauteur / largeur min. La définition android:background="@null"du bouton perd son animation tactile, mais il s'avère que la définition de l'arrière-plan sur n'importe quoi corrige cette bordure.


Je travaille actuellement avec:

minSdkVersion 19
targetSdkVersion 23

1

Donnez à votre bouton un arrière-plan personnalisé: @ drawable / material_btn_blue


0

Vous pouvez également le faire avec layout_width(height) paramètres.

Par exemple, j'ai supprimé l'espace supérieur et inférieur avec le android:layout_height="18dp"code.


0

Un bouton standard n'est pas censé être utilisé en pleine largeur, c'est pourquoi vous en faites l'expérience.

Contexte

Si vous regardez le Material Design - Button Style, vous verrez qu'un bouton a une zone de clic de 48dp de hauteur, mais sera affiché comme 36dp de hauteur pour ... une raison quelconque.

Il s'agit du contour d'arrière-plan que vous voyez, qui ne couvrira pas toute la zone du bouton lui-même.
Il a des coins arrondis et un peu de rembourrage et est censé être cliquable par lui-même, envelopper son contenu et ne pas couvrir toute la largeur en bas de votre écran.

Solution

Comme mentionné ci-dessus, ce que vous voulez, c'est un arrière-plan différent . Pas un bouton standard, mais un arrière-plan pour un élément sélectionnable avec ce bel effet d'entraînement.

Pour ce cas d'utilisation, il existe l' ?selectableItemBackgroundattribut de thème que vous pouvez utiliser pour vos arrière-plans (en particulier dans les listes).
Il ajoutera une ondulation standard de la plate-forme (ou une liste d'états de couleurs sur <21) et utilisera les couleurs de votre thème actuel.

Pour votre cas d'utilisation, vous pouvez simplement utiliser les éléments suivants:

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

Il n'est pas non plus nécessaire d'ajouter des pondérations de mise en page si votre vue est la seule et couvre tout l'écran

Si vous avez une idée différente de ce à quoi votre arrière-plan devrait ressembler, vous devez créer vous-même un dessin personnalisé et gérer la couleur et l'état.

Cette réponse copiée à partir de Question: Comment supprimer correctement le remplissage (ou la marge?) Autour des boutons dans Android?


0

Après des heures à creuser autour de plusieurs réponses, j'ai finalement trouvé une solution qui n'utilise pas un élément différent, ne manipule pas minHeightou minWidth, ou même ne s'enroule pas Buttonautour d'un RelativeLayout.

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

La principale chose à retenir ici est le réglage du premier plan au lieu de l'arrière-plan, comme le stipulent de nombreuses réponses. Changer l'arrière-plan lui-même enselectableItemBackground -même écrasera simplement toutes les modifications que vous avez apportées à la couleur / l'arrière-plan du bouton, le cas échéant.

Changer le premier plan vous donne le meilleur des deux mondes: débarrassez-vous du rembourrage «invisible» et conservez le design de votre bouton.


0

Vous pouvez utiliser le style Borderless dans AppCompatButton comme ci-dessous. et utilisez android: background avec lui.

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

Code du bouton

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

Production:

entrez la description de l'image ici

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.