Alinear la parte superior de la imagen a la parte superior de TextView

Quiero crear un diseño que alinea la parte superior de una imagen a la parte superior de un TextView como este:

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

Intenté hacer esto fijando android:drawableLeft a mi imagen, pero eso centra la imagen verticalmente:

  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. 

¿Es esto posible con sólo un TextView o necesito crear un RelativeLayout que contiene un TextView y un ImageView?

Aquí está la disposición de XML para mi TextView que da la disposición incorrecta:

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

El atributo android:gravity="top" sólo parece afectar el texto, no el dibujable.

5 Solutions collect form web for “Alinear la parte superior de la imagen a la parte superior de TextView”

Puede alinear un compuesto-Dibujable a la parte superior (o inferior) creando un Drawable personalizado que encaje su Drawable y, a continuación, manipule el dibujo de su Drawable personalizado reemplazando el método onDraw(Canvas) .

La siguiente muestra es el ejemplo más simple posible. Esto alinea la imagen a la parte superior, pero también puede hacerla alinear a la parte inferior, izquierda o derecha del TextView implementando la lógica requerida en el onDraw(Canvas) . También es posible que desee construir un margen en el onDraw(Canvas) , para que el píxel de implementación del diseño sea perfecto.

Ejemplo de uso:

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

Código de muestra:

 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(); } } 

Trate de usar 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> 

Creo que hay una manera más fácil y más rápida que tener 3 puntos de vista. Usted necesita preparar 9patch apropiado para el icono y luego usar FrameLayout. Incluso es posible tener solo EditText / TextView utilizando el mismo dibujable como su fondo. Más detalles se describen en esta respuesta .

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

Esto lo haría.

Utilice layout_alignTop . Con él puede alinear la parte superior de la vista a la parte superior de otra vista

 <?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> 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.