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:
- ¿Por qué edittext es hide behinde softkeyboard
- Android EditText, problema del textWatcher del teclado
- Escribiendo en dos campos editados al mismo tiempo
- Android- ¿Cómo puedo mostrar la selección de texto en textview?
- Android RecyclerView: Cambiar archivo de diseño LIST a GRID onOptionItemSelected
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)?
- Cómo establecer el tamaño de texto de etiqueta flotante?
- EditText La propiedad maxLength no se aplica correctamente cuando se usa setFilters
- ¿Cómo usar la clase TextWatcher en Android?
- Pop up árabe / urdu teclado personalizado en editext cuestión
- ¿Cambiar el color del texto mientras el usuario está escribiendo?
- Cómo calcular el texto que puede encajar en un WebView sin desplazamiento
- ¿Hay una forma de realizar un seguimiento de esta excepción: la búsqueda de enfoque devolvió una vista que no pudo tomar el foco
- Reemplazar o eliminar el valor existente en Accessibility EditText Node en android
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:
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!
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"
- Intenta invocar el método virtual 'void android.widget.ListView.setAdapter
- Eliminar los recursos no utilizados antes del envío