Alignez le haut de l'image vers le haut de TextView

Je souhaite créer une mise en page qui aligne le haut d'une image vers le haut d'une TextView comme ceci:

--------- Text text text text text text text | Image | text text text text text text text --------- text text text text text text text text text text text text text text text text text text text. 

J'ai essayé de le faire en configurant android:drawableLeft à mon image, mais cela android:drawableLeft l'image verticalement:

  Text text text text text text text --------- text text text text text text text | Image | text text text text text text text --------- text text text text text text text text text text text text. 

Est-ce possible avec seulement un TextView ou dois-je créer un RelativeLayout contenant un TextView et un ImageView?

Voici la disposition XML de mon TextView qui donne la mise en page incorrecte:

 <TextView android:gravity="top" android:layout_width="fill_parent" android:layout_height="wrap_content" android:drawableLeft="@drawable/image" android:drawablePadding="8dp" android:text="@string/text" /> 

L'attribut android:gravity="top" semble seulement affecter le texte, pas le drawable.

5 Solutions collect form web for “Alignez le haut de l'image vers le haut de TextView”

Vous pouvez aligner un composé – Dessinable vers le haut (ou en bas) en créant un Drawable personnalisé qui enveloppe votre Drawable, puis manipulez le dessin de votre Drawable personnalisé en remplaçant la méthode onDraw(Canvas) .

L'exemple ci-dessous est l'exemple le plus simple possible. Cela aligne l'image vers le haut, mais vous pouvez également l'aligner en bas, à gauche ou à droite de TextView en mettant en œuvre la logique requise dans le mode onDraw(Canvas) . Vous pouvez également créer une marge dans l' onDraw(Canvas) , pour rendre votre pixel de mise en page de conception parfait.

Exemple d'utilisation:

 GravityCompoundDrawable gravityDrawable = new GravityCompoundDrawable(innerDrawable); // NOTE: next 2 lines are important! innerDrawable.setBounds(0, 0, innerDrawable.getIntrinsicWidth(), innerDrawable.getIntrinsicHeight()); gravityDrawable.setBounds(0, 0, innerDrawable.getIntrinsicWidth(), innerDrawable.getIntrinsicHeight()); mTextView.setCompoundDrawables(gravityDrawable, null, null, null); 

Exemple de code:

 public class GravityCompoundDrawable extends Drawable { // inner Drawable private final Drawable mDrawable; public GravityCompoundDrawable(Drawable drawable) { mDrawable = drawable; } @Override public int getIntrinsicWidth() { return mDrawable.getIntrinsicWidth(); } @Override public int getIntrinsicHeight() { return mDrawable.getIntrinsicHeight(); } @Override public void draw(Canvas canvas) { int halfCanvas= canvas.getHeight() / 2; int halfDrawable = mDrawable.getIntrinsicHeight() / 2; // align to top canvas.save(); canvas.translate(0, -halfCanvas + halfDrawable); mDrawable.draw(canvas); canvas.restore(); } } 

Essayez d'utiliser RelativeLayout ……

 <?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" > <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:src="@drawable/ic_launcher" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_toRightOf="@id/imageView1" android:text="@string/text" /> </RelativeLayout> 

Je pense qu'il y a un moyen plus facile et plus rapide que d'avoir 3 vues. Vous devez préparer correctement 9patch pour l'icône, puis utiliser FrameLayout. Il est même possible d'avoir uniquement EditText / TextView utilisant le même dessin que leur arrière-plan. Plus de détails sont décrits dans cette réponse .

 <?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" > <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:src="@drawable/ic_launcher" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/imageView1" android:text="@string/text" /> </RelativeLayout> 

Cela le ferait.

Utilisez layout_alignTop . Avec elle, vous pouvez aligner le haut de la vue vers le haut d'une autre vue

 <?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" > <TextView android:id="@+id/textView1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/text" /> <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@id/textView1" android:layout_toLeftOf="@id/textView1" android:src="@drawable/ic_launcher" /> </RelativeLayout> 
coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.