In Android, how to create EditText of fixed width?
I would like to create an EditText which accepts only numbers, has a maximum of 4 numbers, and is never narrower than it would be if filled with 4 numbers (does not shrink when empty, or have to expand to accommodate 4 numbers, so it's fixed.)
The first 2 are accomplished with: android:inputType="number" and android:maxLength="4".
How can I set the minimum length?
One rarely-used (AFAIK) attribute of an EditText that you can use is:
android:ems="4"
This makes the EditText exactly 4 ems wide. An em width is the width of the widest (M) character in the selected font.
A little hackish, but you can put your EditText
inside a FrameLayout
alongside with another TextView
with text="0000"
and visibility=invisible.
FrameLayout
Should have width=wrap_content
and your EditText
will have width=match_parent
.
That should make it the right width always.
The advantage of this is, it's 100% xml-side, no code involved.
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="0000"
android:visibility="invisible" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"
android:maxLength="4" />
</FrameLayout>
In my situation, I needed the view to be 6 digits wide. android:ems made the field too wide (since the M-character is wider than a digit).
I ended up using a transparent hint which dictates the minimum width of the field. The example below is six digits wide.
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="000000"
android:textColorHint="#00FFFFFF"
android:maxLength="6"
android:inputType="numberPassword" />
This solution is independent of font, letter spacing and other things which may vary. The textColorHint is a 0% opaque white color, so the hint should never be visible to the user.
You can also try using. . .
android:ems="4"
android:maxEms="4"
android:layout_width="wrap_content"
. . . this should insure the tightest fit possibly allowed by the default android edittext style
For additional control with the padding on both left and right you can use
android:background="#ffffff"
android:paddingLeft="0dp"
android:paddingRight="0dp"
Use android:width="XXX.Xdp"
This lets you set the width in density pixels which ought to be relative to the screen density. I tried using ems based for a field 2 chars wide, but since ems requires a int, 2 was too small and 3 was too big. Blech.