I'm trying hard to find a way of aligning an EditText
and an ImageView
properly on Android. I keep getting this result:
The XML part is quite 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>
I've also tried many of the suggestions below, including PravinCG's (RelativeLayout with 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>
But the result is exactly the same.
I've tried playing with the EditText's background padding, intrinsic height, but to no avail.
The EditText's background drawable is different among Android versions/ROMs, and I want to support them all.
How can I make this alignment pixel perfect on any android version (and style)?
You need to use
RelativeLayout
withandroid:align_bottom
andandroid:align_Top
attribute. I am not writing the code though.Have you tried the
setCompoundDrawables()
methods for theEditText
.You can try setting the intrinsic bounds using the
setBounds()
method on the Drawable or by using thesetCompoundDrawablesWithInstrinsicBounds()
method.This should work on all devices.
Finally found a suitable solution that scales across different Android versions/ROMs/styles.
The main problem is that the EditText's background drawable itself has transparent padding:
Also, I've noticed this transparent padding varies a lot between different Android versions/ROMs/styles (stock ICS, for instance, has no transparent padding at all).
In a mid-way conclusion, my original code properly alignes my ImageView with my EditText. However, what I really want is to align my ImageView with the visible part of the EditText's background.
To achieve this, I scan a Bitmap I create from my EditText's background drawable. I scan it top-bottom and bottom-up to find the amount of fully transparent lines and use those values as top/bottom padding for my ImageView. All this consistently takes less than 5ms on my N1. Here's the code:
And it works like a charm!
use
android:layout_centerInParent = true
for edit text and see weather it works?remove editText's and ImageView's properties android:gravity="center" and set gravity property of linearlayout to center_vertically.
To get rid of the padding in the EditText, just use a custom image as background... rectangle with some shadow is enough... or whatever you like... and assign the background to the EditText using