web-dev-qa-db-fra.com

android: drawableLeft margin et/ou padding

Est-il possible de définir la marge ou le remplissage pour l'image que nous avons ajoutée avec le Android:drawableLeft?

317
androidNewbies

Comme cephus le mentionne, Android:drawablePadding ne forcera le remplissage entre le texte et le dessin que si le bouton est assez petit.

Lors de la disposition de boutons plus grands, vous pouvez utiliser Android:drawablePadding conjointement avec Android:paddingLeft et Android:paddingRight pour forcer le texte à être dessiné vers le centre du bouton. En ajustant séparément les marges gauche et droite, vous pouvez effectuer des réglages très détaillés de la mise en page.

Voici un exemple de bouton qui utilise un rembourrage pour rapprocher le texte et l'icône de ce qu'ils seraient par défaut:

<Button Android:text="@string/button_label" 
    Android:id="@+id/buttonId"
    Android:layout_width="160dip"
    Android:layout_height="60dip"
    Android:layout_gravity="center"
    Android:textSize="13dip"
    Android:drawableLeft="@drawable/button_icon"
    Android:drawablePadding="2dip"
    Android:paddingLeft="30dip"
    Android:paddingRight="26dip"
    Android:singleLine="true"
    Android:gravity="center" />  
415
Jordan

TextView a une propriété Android: drawablePadding qui devrait faire l'affaire:

Android: drawablePadding

Le remplissage entre les tirables et le texte.

Doit être une valeur de cote, qui est un nombre à virgule flottante ajouté avec une unité telle que "14.5sp". Les unités disponibles sont: px (pixels), dp (pixels indépendants de la densité), sp (pixels mis à l'échelle en fonction de la taille de police préférée ), in (pouces), mm (millimètres).

Cela peut également être une référence à une ressource (sous la forme "@ [Paquet:] type: nom") ou à un attribut de thème (sous la forme "?? [Paquet:] [type:] nom") contenant une valeur de ce type.

Cela correspond au symbole de ressource d'attribut global drawablePadding.

166
Cheryl Simon

Android:drawablePadding ne créera un espace de remplissage entre le texte et le dessin que si le bouton est assez petit pour écraser les 2 ensemble. Si votre bouton est plus large que la largeur combinée (drawableLeft/drawableRight) ou la hauteur (drawableTop/drawableBottom), alors drawablePadding ne fait rien.

Je me bats avec cela aussi maintenant. Mes boutons sont assez larges et l'icône est suspendue sur le bord gauche du bouton et le texte est centré au centre. Mon seul moyen de contourner cela pour le moment a été de cuire une marge sur le dessin en ajoutant des pixels vierges au bord gauche de la toile avec Photoshop. Pas idéal, et pas vraiment recommandé non plus. Mais c’est ma solution provisoire pour l’instant, à moins de reconstruire TextView/Button.

56
cephus

Oui. utilisez drawablePadding comme suit,

<TextView
        Android:id="@+id/tvHeader"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:text="Settings and Contents"
        Android:drawableLeft="@drawable/icon_success"
        Android:drawablePadding="10dp" />
38
Parinda Rajapaksha

Android:drawablePadding est le moyen le plus simple de donner du remplissage à l’icône dessiné, mais vous ne pouvez pas donner de remplissage spécifique comme paddingRight ou paddingLeft de l’icône dessinable.Pour y parvenir, vous devez creuser ..__ Si vous appliquez paddingLeft ou paddingRight à Edittext, le remplissage sera ajouté à Edittext complet avec une icône dessinable.

32
Bhargav Pandit

Faites votre drawable resources.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_checked="true">
        <inset Android:drawable="@drawable/small_m" Android:insetLeft="10dp" Android:insetTop="10dp" />
    </item>
    <item>
        <inset Android:drawable="@drawable/small_p" Android:insetLeft="10dp" Android:insetTop="10dp" />
    </item>
</selector>
31

définir une forme pour votre edittext et lui donner un rembourrage Par exemple

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:shape="rectangle" >
    <padding
        Android:left="5dp"
        Android:right="5dp"
    />
    <solid Android:color="#F6F6F6" />
    <stroke
        Android:width="1px"
        Android:color="#C3C3C3" />

    <corners
        Android:bottomLeftRadius="1dp"
        Android:bottomRightRadius="1dp"
        Android:topLeftRadius="1dp"
        Android:topRightRadius="1dp" />
</shape>

Le rembourrage défini dans cette forme aidera à donner un rembourrage à tirant ou à droite ---------------------- Appliquer cette forme sur EditView

 <EditText
            Android:id="@+id/example"
            Android:layout_width="fill_parent"
            Android:layout_height="36dp"
            Android:layout_marginLeft="10dp"
            Android:layout_marginRight="10dp"
            Android:background="@drawable/shape2"
            Android:drawableLeft="@drawable/icon1"
            Android:drawablePadding="@dimen/txtDrwblPadding"
            Android:ems="10"
         />

utiliser cette forme définie comme arrière-plan donnera à votre EditText un style plus une marge pour drawableLeft.

12
Umesh N

Au lieu de Button, utilisez LinearLayout avec ImageView et TextView à l'intérieur. Dans les éléments enfants tels que ImageView et TextView, utilisez Android:duplicateParentState="true".

7
Alexey Zakharov
<TextView
    Android:layout_width="wrap_content"
    Android:layout_height="32dp"
    Android:background="@drawable/a"
    Android:drawableLeft="@drawable/concern_black"
    Android:gravity="center"
    Android:paddingLeft="10dp"
    Android:paddingRight="10dp"
    Android:drawablePadding="10dp"
    Android:text="text"/>

remarque: layout_width doit être wrap_content et utiliser paddingLeft paddingRight drawablePadding pour contrôler les espaces. Si vous spécifiez la valeur layout_width pour avoir un espace entre l'icône et le texte, je pense qu'une fois que vous attribuez à layout_width une valeur de spécification, le remplissage mesurera.

7
王良海

Vous pouvez utiliser un rembourrage pour le bouton et vous pouvez jouer avec drawablePadding 

 <Button
    style="@style/botonesMenu"
    Android:padding="15dp"
    Android:drawablePadding="-15dp"
    Android:text="@string/actualizarBD"
    Android:textAlignment="gravity"
    Android:gravity="center"
    Android:layout_row="1"
    Android:layout_column="0"
    Android:drawableTop="@drawable/actualizar"
    Android:id="@+id/btnActualizar"
    Android:onClick="actualizarBD" />

vous pouvez utiliser un rembourrage spécifique qui dépend de votre emplacement, avec Android: paddingLeft = "10dp" ou Android: paddingBottom = "10dp" ou Android: paddingRight = "10dp" ou Android: paddingTop = "10dp"

4
Carolina

Je vais aussi jeter ma réponse sur le ring. Si vous souhaitez le faire par programme, vous pouvez procéder comme suit.

final Drawable drawable = ContextCompat.getDrawable(getContext(), R.drawable.somedrawable);
final boolean isLTR = ViewCompat.LAYOUT_DIRECTION_LTR == ViewCompat.getLayoutDirection(this);
final int iconInsetPadding = getResources().getDimensionPixelSize(R.dimen.icon_padding);

final Drawable insetDrawable = new InsetDrawable(drawable, isLTR ? 0 : iconInsetPadding, 0, isLTR ? iconInsetPadding : 0, 0);

Cela ajoutera le remplissage à la fin du dessin, où fin signifiera gauche/droite selon que le téléphone est en mode LTR ou RTL.

3
Daniel Ochoa

Vous devriez envisager d'utiliser une liste de couches

Créez un fichier comme celui-ci, appelez-le ic_calendar.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item>
    <shape Android:shape="rectangle">
        <solid Android:color="@Android:color/transparent"/>
    </shape>
</item>
<item Android:right="10dp">
    <bitmap Android:gravity="center_vertical|left"
        Android:src="@drawable/ic_calendar_16dp"
        Android:tint="@color/red"
        />
</item>
</layer-list>

Sous fichier de mise en page,

<TextView
         Android:id="@+id/tvDate"
         Android:layout_width="match_parent"
         Android:layout_height="wrap_content"
         Android:drawableLeft="@drawable/ic_calendar"
         Android:textColor="@color/colorGrey"
         Android:textSize="14sp" 
    />
3
RayChongJH

Android: drawablePadding est le moyen le plus simple d’attribuer un rembourrage à l’icône dessinable, mais vous ne pouvez pas attribuer un rembourrage spécifique comme un paddingDroite ou un paddingLeft of dessiné. Pour y parvenir, vous devez creuser. Et si vous appliquez paddingLeft ou paddingRight to Edittext, le padding sera placé sur l'ensemble de Edittext avec une icône dessinable.

<TextView Android:layout_width="match_parent"
Android:padding="5sp"
Android:id="@+id/date"
Android:gravity="center|start"
Android:drawableEnd="@drawable/ic_calendar"
Android:background="@drawable/edit_background"
Android:hint="Not Selected"
Android:drawablePadding="10sp"
Android:paddingStart="10sp"
Android:paddingEnd="10sp"
Android:textColor="@color/black"
Android:layout_height="wrap_content"/>
3
Sekhon123

Vous pouvez utiliser Android:drawableLeft="@drawable/your_icon" pour que le dessin puisse être affiché à gauche. Afin de définir un remplissage pour le dessin, vous devez utiliser le Android:paddingLeft ou le Android:paddingRight pour définir le remplissage gauche/droit, respectivement.

Android:paddingRight="10dp"
Android:paddingLeft="20dp"
Android:drawableRight="@drawable/ic_app_manager"
2
textView.setCompoundDrawablesWithIntrinsicBounds(AppCompatResources.getDrawable(this,drawable),null,null,null);

addressTitleView.setCompoundDrawablePadding();
0
Srinivas Kokkula

Si la taille de la ressource pouvant être dessinée est fixe, vous pouvez procéder comme suit: 

<Button
    Android:background="@drawable/rounded_button_green"
    style="?android:attr/selectableItemBackground"
    Android:layout_height="wrap_content"
    app:layout_widthPercent="70%"
    Android:drawableRight="@drawable/ic_clear_black_24dp"
    Android:paddingRight="10dp"
    Android:paddingLeft="34dp"
    tools:text="example" />

La clé ici est que:

    Android:drawableRight="@drawable/ic_clear_black_24dp"
    Android:paddingRight="10dp"
    Android:paddingLeft="34dp"

C'est-à-dire que la taille de la ressource pouvant être extraite, plus paddingRight, correspond à paddingLeft.

Vous pouvez voir le résultat dans cet exemple

0
user3344964

il suffit de refaire de:

<?xml version="1.0" encoding="utf-8"?>
<shape
        xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <corners Android:radius="40dp"/>

    <solid Android:color="@Android:color/white"/>

</shape>

à

<layer-list
        xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item
            Android:right="@dimen/xxxs"
            Android:left="@dimen/xxxs"
            Android:bottom="@dimen/xxxs"
            Android:top="@dimen/xxxs"
            >
        <shape
                xmlns:Android="http://schemas.Android.com/apk/res/Android">

            <corners Android:radius="40dp"/>

            <solid Android:color="@Android:color/white"/>

        </shape>
    </item>

</layer-list>
0
nicolas asinovich