Reputation: 1582
The default EditText background seems to put ~ 4dp of padding on the left. This causes misalignment with other widgets.
I made a simple app to demonstrate. Screenshot:
Layout:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:background="#00ff00"
android:text="@string/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="HINT"
android:text="TEXT"
android:singleLine="true"/>
<TextView
android:background="#00ff00"
android:text="@string/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
Is there anyway to stop it from doing this?
Upvotes: 25
Views: 10996
Reputation: 91
This issue comes from the default value of ?android:attr/editTextBackground
.
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetBottom="@dimen/abc_edit_text_inset_bottom_material"
android:insetLeft="@dimen/abc_edit_text_inset_horizontal_material"
android:insetRight="@dimen/abc_edit_text_inset_horizontal_material"
android:insetTop="@dimen/abc_edit_text_inset_top_material">
<selector>
<item android:state_enabled="false">
<nine-patch
android:alpha="?android:attr/disabledAlpha"
android:src="@drawable/abc_textfield_default_mtrl_alpha"
android:tint="?attr/colorControlNormal" />
</item>
<item
android:state_focused="false"
android:state_pressed="false">
<nine-patch
android:src="@drawable/abc_textfield_default_mtrl_alpha"
android:tint="?attr/colorControlNormal" />
</item>
<item>
<nine-patch
android:src="@drawable/abc_textfield_activated_mtrl_alpha"
android:tint="?attr/colorControlActivated" />
</item>
</selector>
</inset>
As you can see the inset value for all edges of EditText is abc_edit_text_inset_top_material = 4dp
. That makes EditText has small padding around its content.
To remove that padding you should create a new EditText style with modified editTextBackground
attribute. For example:
<style name="Widget.App.TextField" parent="@style/Widget.AppCompat.EditText">
<item name="colorControlActivated">#303E44</item>
<item name="colorControlHighlight">#E5E9EC</item>
<item name="colorControlNormal">#E5E9EC</item>
<item name="editTextBackground">@drawable/background_new_edit_text</item>
<item name="android:editTextBackground">@drawable/background_new_edit_text</item>
</style>
New background_edit_text.xml
(Remember to put this file into correct drawable directory so it will not be overried such as drawable-v21...)
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:inset="@dimen/spacing_0dp">
<selector>
<item android:state_enabled="false">
<nine-patch
android:alpha="?android:attr/disabledAlpha"
android:src="@drawable/abc_textfield_default_mtrl_alpha"
android:tint="?attr/colorControlNormal" />
</item>
<item
android:state_focused="false"
android:state_pressed="false">
<nine-patch
android:src="@drawable/abc_textfield_default_mtrl_alpha"
android:tint="?attr/colorControlNormal" />
</item>
<item>
<nine-patch
android:src="@drawable/abc_textfield_activated_mtrl_alpha"
android:tint="?attr/colorControlActivated" />
</item>
</selector>
</inset>
Apply new style to your EditText
:
<EditText
android:id="@+id/edt_phone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/Widget.App.TextField"
/>
Upvotes: 3
Reputation: 174
Use android:layout_marginLeft="-4dp"
in edit text field as follows.
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="HINT"
android:text="TEXT"
android:layout_marginLeft="-4dp"
android:singleLine="true"/>
Upvotes: 4
Reputation: 2611
If you want to align only the text and not the line underneath, you can overwrite the padding programmatically.
So let's say this layout is for an activity. Once the activity has been created you can do something like:
findViewById(R.id.edit_text).setPaddding(
0,
old_top_paddding,
old_right_paddding,
old_bottom_padding);
The key is to re-set the padding once the background has been applied. You might need to watch for cases where the background is set again, so maybe one idea is to override the setBackground*()
methods and re-set the padding there.
Upvotes: -1
Reputation: 22212
Did you try adding android:background="@android:color/transparent"?
I did the same example with this result
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:background="#00ff00"
android:text="@string/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="HINT"
android:text="TEXT"
android:background="@android:color/transparent"
android:singleLine="true"/>
<TextView
android:background="#00ff00"
android:text="@string/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
Second way with lines
Add an xml file in drawable like this
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@android:color/transparent" /> <!--background color of box-->
</shape>
</item>
<item
android:top="-2dp"
android:right="-2dp"
android:left="-2dp">
<shape>
<solid android:color="@android:color/transparent" />
<stroke
android:width="1dp"
android:color="#000000" /> <!-- color of stroke -->
</shape>
</item>
</layer-list>
then in your layout add this in your EditText android:background="@drawable/edittext_background"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:background="#00ff00"
android:text="@string/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="HINT"
android:text="TEXT"
android:background="@drawable/edittext_background"
android:singleLine="true"
android:layout_marginBottom="3dp"/>
<TextView
android:background="#00ff00"
android:text="@string/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
Upvotes: 7
Reputation: 139
One workaround is to use negative margin on the sides (-4dp)
This will only work when the EditText background matches the Layout background, and you don't have anything on the sides in the Layout that would be covered by the EditText
Upvotes: 13
Reputation: 4863
Change background of EditText to custom, it have nine-patch padding
Upvotes: 2