Alinee ImageView con EditText horizontalmente

Estoy tratando de encontrar una manera de alinear un EditText y un ImageView correctamente en Android. Sigo recibiendo este resultado:

Introduzca aquí la descripción de la imagen

La parte XML es bastante simple:

 <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="fill_parent" android:gravity="center" android:scaleType="centerInside" android:src="@drawable/android" android:visibility="gone" /> <EditText android:id="@+id/edittext" android:layout_width="fill_parent" android:layout_height="wrap_content" android:singleLine="true" /> </LinearLayout> 

También he probado muchas de las sugerencias siguientes, incluyendo PravinCG (RelativeLayout con alignTop / alignBottom):

 <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:orientation="horizontal" > <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/edittext" android:layout_alignTop="@+id/edittext" android:scaleType="centerInside" android:src="@drawable/android" android:visibility="visible" /> <EditText android:id="@+id/edittext" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_toRightOf="@id/image" android:hint="@string/username" android:singleLine="true" /> </RelativeLayout> 

Pero el resultado es exactamente el mismo.

He intentado jugar con el relleno de fondo de EditText, altura intrínseca, pero sin éxito.

El fondo de EditText dibujable es diferente entre las versiones de Android / ROM, y quiero apoyar a todos ellos.

¿Cómo puedo hacer que este píxel de alineación sea perfecto en cualquier versión de android (y estilo)?

Finalmente encontró una solución adecuada que se escala a través de diferentes versiones de Android / ROMs / estilos.

El problema principal es que el fondo de EditText puede dibujarse en sí mismo tiene relleno transparente: Introduzca aquí la descripción de la imagen

Además, he notado que este relleno transparente varía mucho entre diferentes versiones de Android / ROMs / estilos (stock ICS, por ejemplo, no tiene relleno transparente en absoluto).

En una conclusión a mitad de camino, mi código original alignes correctamente mi ImageView con mi EditText. Sin embargo, lo que realmente quiero es alinear mi ImageView con la parte visible del fondo del EditText.

Para lograr esto, escanear un mapa de bits que crear desde el fondo de mi EditText dibujable. Lo escaneo de arriba a abajo y de abajo a arriba para encontrar la cantidad de líneas completamente transparentes y usar esos valores como relleno superior / inferior para mi ImageView. Todo esto toma constantemente menos de 5ms en mi N1. Aquí está el código:

 if(editor.getBackground() != null) { int width = editor.getWidth(); int height = editor.getHeight(); Drawable backgroundDrawable = editor.getBackground().getCurrent(); // Paint the editor's background in our bitmap Bitmap tempBitmap = Bitmap.createBitmap(width, height, Config.ARGB_4444); backgroundDrawable.draw(new Canvas(tempBitmap)); // Get the amount of transparent lines at the top and bottom of the bitmap to use as padding int topPadding = countTransparentHorizontalLines(0, height, tempBitmap); int bottomPadding = countTransparentHorizontalLines(height-1, -1, tempBitmap); // Discard the calculated padding if it means hiding the image if(topPadding + bottomPadding > height) { topPadding = 0; bottomPadding = 0; } tempBitmap.recycle(); // Apply the padding image.setPadding(0, topPadding, 0, bottomPadding); } private int countTransparentHorizontalLines(int fromHeight, int toHeight, Bitmap bitmap) { int transparentHorizontalLines = 0; int width = bitmap.getWidth(); int currentPixels[] = new int[width]; boolean fullyTransparentLine = true; boolean heightRising = (fromHeight < toHeight); int inc = heightRising ? 1 : -1; for(int height = fromHeight; heightRising ? (height < toHeight) : (toHeight < height); height+=inc) { bitmap.getPixels(currentPixels, 0, width, 0, height, width, 1); for(int currentPixel : currentPixels) { if(currentPixel != Color.TRANSPARENT && Color.alpha(currentPixel) != 255) { fullyTransparentLine = false; break; } } if(fullyTransparentLine) transparentHorizontalLines++; else break; } return transparentHorizontalLines; } 

Y funciona como un encanto!

¡funciona!

Es necesario utilizar RelativeLayout con android:align_bottom y android:align_Top atributo. No estoy escribiendo el código sin embargo.

¿Has probado los métodos setCompoundDrawables() para el EditText .

Puede intentar establecer los límites intrínsecos utilizando el método setBounds() en Drawable o utilizando el método setCompoundDrawablesWithInstrinsicBounds() .

Esto debería funcionar en todos los dispositivos.

Para deshacerse del relleno en el EditText, solo usa una imagen personalizada como fondo … un rectángulo con alguna sombra es suficiente … o lo que quieras … y asigna el fondo al EditText usando

 android:background="@drawable/myBackground" 

android:layout_centerInParent = true para editar el texto y ver el tiempo que funciona?

Quite las propiedades de editText y ImageView android: gravity = "center" y establezca la propiedad de gravedad de linearlayout a center_vertically.

Utilicé una solución rápida moviendo simplemente el EditText abajo 2dp simplemente agregando el siguiente a la EditText:

 android:layout_marginBottom="-2dp" android:layout_marginTop="2dp" 
  • Posicionamiento de EditText por encima del teclado
  • ¿Cómo elimino texto en EditText con TextWatcher? Cada vez que detecta una cadena y formatea su
  • EditText no se actualiza después de que se cambió el texto en TextWatcher
  • EditText, adjustPan, ScrollView problema en android
  • ¿Hay alguna forma de ocultar el teclado virtual permanentemente pero mantener la habilitación de enfoque para un EditText?
  • InputFilter en EditText causa que el texto se repita
  • Cómo deshabilitar el botón "Siguiente" en un teclado del software EditText (reemplazar con el botón "Listo")
  • Android Edittext- Expansión de vanos
  • EditText lineSpacingExtra comportamiento extraño
  • EditText lineSpacingExtra emisión
  • Accesibilidad de Android en el texto de edición con sugerencia
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.