web-dev-qa-db-fra.com

Gardez le texte dans TextView avec drawableLeft centré

Dans mon application, j'ai une barre d'en-tête qui consiste en une seule vue de texte avec fill_parent comme largeur, qui a une couleur d'arrière-plan spécifique et du texte centré. Maintenant, je veux ajouter un dessin sur le côté gauche de la barre d’en-tête. Je règle donc drawableLeft et le texte et l’image sont affichés. Cependant, le problème réside dans le fait que le texte n'est plus correctement centré, par exemple, lorsque le dessin est ajouté, le texte est légèrement décalé vers la droite, comme indiqué dans les captures d'écran:

without drawable
with drawable

Y at-il de toute façon que je puisse centrer le texte correctement et faire en sorte que le dessin puisse être positionné comme ci-dessus sans utiliser d'élément de mise en page supplémentaire (tel qu'un LinearLayout)?

38
Jacob

Bien que fragile, vous pouvez éviter l’utilisation d’une disposition wrapper en définissant unnégatifpadding sur le dessinable:

<TextView
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:layout_centerHorizontal="true"
    Android:drawableLeft="@drawable/icon"
    Android:drawablePadding="-20sp"
    Android:text="blah blah blah" />

Vous devrez ajuster le rembourrage à la largeur du dessinable, mais il ne vous restera plus qu'un seul TextView au lieu d'un LinearLayout supplémentaire, etc.

18
blahdiblah

J'ai rencontré un problème similaire. Résolu en utilisant une seule variable TextView avec les paramètres layout_width="wrap_content" et layout_gravity="center"

<TextView
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:drawableLeft="@drawable/some_drawable"
    Android:text="some text"
    Android:layout_gravity="center"
    Android:gravity="center"
    />
9
birdy

Essayez de suivre:

<TextView
    Android:id="@+id/textView"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_gravity="center_horizontal"
    Android:padding="10dp"
    Android:textAlignment="center" />
5
Programmer

J'ai eu le même problème et je l'ai résolu avec de petits changements dans Textview,

<TextView
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:gravity="center"
    Android:drawableLeft="@drawable/search_red"
    Android:text="your text goes here"
    />
5
Deepak

Vous pouvez utiliser Android:gravity="center_vertical" pour centrer le texte verticalement avec l'image. Ou bien il peut être centré dans textView à l'aide de Android:gravity="center".

<TextView
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:gravity="center"
    Android:drawableLeft="@drawable/icon"
    Android:text="Your text here" />

3
Quentin Colle

utiliser de cette façon 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:background="@color/White"
     >

  <RelativeLayout
       Android:id="@+id/rlheader"
       Android:layout_width="fill_parent"
       Android:layout_height="50dp"
       Android:layout_alignParentTop="true"
       Android:background="@color/HeaderColor"

        >

        <TextView

           Android:layout_width="wrap_content"
           Android:layout_height="wrap_content"
           Android:layout_centerHorizontal="true"
           Android:layout_centerVertical="true"
           Android:text="Header_Title"
            />

        <ImageView
           Android:id="@+id/ivSetting"
           Android:layout_width="wrap_content"
           Android:layout_height="wrap_content"
           Android:layout_alignParentLeft="true"
           Android:layout_centerVertical="true"
           Android:layout_marginLeft="10dp"
           Android:src="@drawable/setting" />


    </RelativeLayout>

</RelativeLayout>

il ressemble à quelque chose comme ce cliché de mon projet de démonstration 

Header Image

3
Khan

Cela fonctionne pour moi.

<LinearLayout
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:gravity="center"
    Android:orientation="horizontal">

    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:drawableLeft="@drawable/trusted"
        Android:gravity="center"
        Android:text="@string/trusted"/>

</LinearLayout>
3

Vous pouvez définir le parent de TextView en tant que RelativeLayout dont la largeur est match_parent.

<RelativeLayout
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

<TextView
        Android:id="@+id/edit_location_text_view"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_above="@id/add_location_text_view"
        Android:gravity="start|center_vertical"
        Android:layout_centerHorizontal="true"
        Android:drawableStart="@Android:drawable/ic_menu_edit"
        Android:text="Edit Location" />

</RelativeLayout>

 This is what the result looks like.

2
Rohan Taneja

Supprimez DrawableLeft et utilisez un conteneur FrameLayout.

<FrameLayout
     Android:id="@+id/container"
     Android:layout_width="match_parent"
     Android:layout_height="wrap_content" >

     <ImageView
         Android:id="@+id/image"
         Android:layout_width="wrap_content"
         Android:layout_height="wrap_content"
         Android:layout_marginLeft="5dp"
         Android:layout_gravity="center_vertical"
         Android:src="@drawable/image" />

     <TextView
        Android:id="@+id/text"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:text="Text"
        Android:layout_gravity="center" />
</FrameLayout>
1
EpicPandaForce

La réponse acceptée ne fonctionne pas pour moi. Elle échoue si la largeur de TextView est identique à celle du parent, je l'ai fait avec FrameLayout.

 <FrameLayout
        Android:layout_width="match_parent"
        Android:layout_height="50dp"
        Android:layout_marginTop="10dp"
        Android:background="#000">

        <TextView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_gravity="center"
            Android:drawableStart="@drawable/ic_circle_check_white"
            Android:drawablePadding="10dp"
            Android:text="Header"
            Android:textColor="#fff"
            Android:textSize="14sp"/>

    </FrameLayout>
0
Ajay Chauhan

vous pouvez définir votre en-tête comme ça 

<RelativeLayout
             Android:id="@+id/linearLayout1"
             Android:layout_width="match_parent"
             Android:layout_height="wrap_content"
             Android:background="@drawable/head" >

             <ImageView
                 Android:id="@+id/cat"
                 Android:layout_width="wrap_content"
                 Android:layout_height="wrap_content"

                 Android:layout_marginLeft="5dp"
                 Android:onClick="onClick"
                 Android:layout_marginTop="10dp"
                 Android:src="@drawable/btn_back_" />


         <RelativeLayout
             Android:id="@+id/linearLayout1"
             Android:layout_width="fill_parent"
             Android:layout_height="wrap_content"
             Android:gravity="center" >

           <TextView
 Android:id="@+id/TvTitle"
 Android:layout_width="wrap_content"
 Android:layout_height="wrap_content"
 Android:text=""
 Android:layout_marginLeft="10dp"
 Android:layout_marginRight="10dp"
 Android:textColor="#000000" 

 Android:textSize="20sp"/>
             </RelativeLayout>

         </RelativeLayout>

Donnez juste la hauteur de Textview, la source de l'image selon vos besoins

0
Aamirkhan

drawable fait partie de TextView, donc la hauteur de la vue du texte sera la hauteur de la dessinable si la hauteur de votre texte est inférieure à la hauteur de la dessinable.

Vous pouvez définir l'attribut Gravity de TextView sur center_vertical afin que le texte soit au centre.

0
abcfrom0
> This line is important ->> Android:gravity="start|center_vertical


 <LinearLayout
            Android:layout_width="match_parent"
            Android:layout_margin="@dimen/marginplus2"
            Android:layout_height="wrap_content">

            <TextView
                Android:layout_width="0dp"
                Android:layout_weight="1"
                Android:text="@string/like"
                Android:gravity="start|center_vertical"
                Android:drawablePadding="@dimen/marginplus1"
                Android:drawableLeft="@drawable/ic_like"
                Android:layout_height="wrap_content" />

            <TextView
                Android:layout_width="0dp"
                Android:layout_weight="1.5"
                Android:text="@string/comments"
                Android:drawablePadding="@dimen/marginplus1"
                Android:gravity="start|center_vertical"
                Android:drawableLeft="@drawable/ic_comment"
                Android:layout_height="wrap_content" />
            <TextView
                Android:layout_width="0dp"
                Android:layout_weight="1"
                Android:text="@string/share"
                Android:drawablePadding="@dimen/marginplus1"
                Android:gravity="start|center_vertical"
                Android:drawableLeft="@drawable/ic_share"
                Android:layout_height="wrap_content" />

        </LinearLayout>
0
vikas singh

le meilleur moyen consiste à utiliser ConstraintLayout, pour rendre la vue texte au centre de la présentation et la largeur wrap_content (n'utilisez pas 0dp maintenant) afin que le dessin puisse suivre le texte.

<TextView
    Android:id="@+id/tv_test"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:text="test"
    Android:drawableLeft="@drawable/you_drawable"
    Android:drawablePadding="5dp"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    />
0
sumang_87

Si aucune des solutions ci-dessus ne vous convient?? Puis essayez ci-dessous la réponse

Exemple de capture d’écran du dessin .  enter image description here

Pour l'image ci-dessus, veuillez trouver le code ci-dessous.

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

    <Android.support.v7.widget.CardView
        Android:id="@+id/my_card"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">

        <LinearLayout
            Android:id="@+id/bb"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:divider="@color/gray"
            Android:orientation="horizontal"
            Android:weightSum="2">

            <TextView
                Android:id="@+id/filter_tv"
                style="?android:attr/buttonBarButtonStyle"
                Android:layout_width="wrap_content"
                Android:layout_height="?attr/actionBarSize"
                Android:layout_gravity="center_horizontal"
                Android:layout_weight="1"
                Android:drawableLeft="@drawable/ic_baseline_filter_list"
                Android:gravity="center|fill_horizontal"
                Android:paddingLeft="60dp"
                Android:text="Filter"
                Android:textAllCaps="false"
                Android:textStyle="normal" />

            <View
                Android:layout_width="1dp"
                Android:layout_height="match_parent"
                Android:layout_below="@+id/bb"
                Android:background="@color/gray" />

            <TextView
                Android:id="@+id/sort_tv"
                style="?android:attr/buttonBarButtonStyle"
                Android:layout_width="wrap_content"
                Android:layout_height="?attr/actionBarSize"
                Android:layout_gravity="center|center_horizontal"
                Android:layout_weight="1"
                Android:drawableLeft="@drawable/ic_baseline_sort"
                Android:drawablePadding="20dp"
                Android:gravity="center|fill_horizontal"
                Android:paddingLeft="40dp"
                Android:text="Sort"
                Android:textAllCaps="false" />

        </LinearLayout>
    </Android.support.v7.widget.CardView>

    <View
        Android:layout_width="match_parent"
        Android:layout_height="0.9dp"
        Android:layout_below="@+id/my_card"
        Android:background="@color/gray" />
</RelativeLayout>
0
Suresh Maidaragi

Une solution simple consiste à utiliser une image transparente de même taille du côté opposé à la vue texte . Dans mon exemple, j'ai copié mon vector_image et modifié les couleurs afin qu'elles soient transparentes.

<TextView
        Android:id="@+id/name"
        style="@style/TextStyle"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:drawableEnd="@drawable/ic_vector_caret_down_green"
        Android:drawableStart="@drawable/ic_vector_space_18"
        Android:gravity="center"
        Android:padding="12dp"
        Android:textColor="@color/green"/>
0
Furedal
<TextView
    Android:id="@+id/distance"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_gravity="center_horizontal"
    Android:drawableLeft="@drawable/distance"
    Android:drawablePadding="10dp"
    Android:padding="10dp"
    Android:textAlignment="center"
    Android:textColor="#ffffff"
    Android:textSize="20sp" />
0
Harshil