Nactus
Nactus

Reputation: 712

EditText padding attribute does not work the same for API 19 and 21

I'm attaching a screen capture with both 19 and 21 emulators running: enter image description here

The one on the left is Android 19 and the one on the right is 21. As you can see, the API 19 based emulator does not respect the padding attribute. Same thing happens on a 4.4.x device, so it's not only an emulator problem.

This is the .xml code I'm using for this activity:

<RelativeLayout 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"
tools:context="com.birsan.cardbox.FolderScreen">

<ImageView
    android:id="@+id/magnifying_glass_icon"
    android:layout_width="20dp"
    android:layout_height="20dp"
    android:layout_alignBottom="@+id/search_button"
    android:layout_alignLeft="@+id/search_folder"
    android:layout_alignStart="@+id/search_folder"
    android:layout_marginBottom="2dp"
    android:layout_marginLeft="9dp"
    android:layout_marginStart="9dp"
    android:contentDescription="magnifying glass"
    android:src="@drawable/ic_menu_search" />

<include
    android:id="@+id/toolbar"
    layout="@layout/app_bar" />


<EditText
    android:id="@+id/search_folder"
    android:layout_width="250dp"
    android:layout_height="30dp"
    android:layout_marginLeft="8dp"
    android:layout_marginTop="10dp"
    android:background="@drawable/search_custom_widget"
    android:focusable="true"
    android:hint="Search in folders"
    android:iconifiedByDefault="false"
    android:paddingLeft="40dp"
    android:paddingRight="55dp"
    android:singleLine="true"
    android:textSize="14sp"

    android:textStyle="bold" />

<Button
    android:id="@+id/search_button"
    style="?android:attr/buttonStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="26dp"
    android:layout_alignBottom="@+id/search_folder"
    android:layout_alignEnd="@+id/search_folder"
    android:layout_alignRight="@+id/search_folder"
    android:layout_marginBottom="2dp"
    android:layout_marginRight="2dp"
    android:background="@color/my_blue"

    android:text="Go"
    android:textColor="#fff"
    android:textSize="10sp" />


<com.name.cardbox.SlidingTabLayout
    android:id="@+id/sliding_tabs"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_below="@+id/app_bar"
    android:layout_marginTop="40dp"
    android:background="@color/my_blue" />


<android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/sliding_tabs"
    android:background="#fff">


</android.support.v4.view.ViewPager>

Why the discrepancy? What am I missing and how can I fix it? Thanks.

Upvotes: 3

Views: 3056

Answers (2)

user781729
user781729

Reputation:

You should now be using android:paddingStart instead of android:paddingLeft anyway, and it also fixes this bug. There's no system fix coming for this it seems.

Upvotes: 0

Abhishek V
Abhishek V

Reputation: 12526

This seems to be a bug in API 21 - Issue 77982.

Should be fixed in future releases. For temporary fix, try setting the padding dynamically.

update : 1) Actually, the 21 works fine. Is the 19 that doesn't.

The bug itself is - "the padding works fine in api 21 and doesn't work in lower android devices". This bug is present in sdk 21 and since you are compiling your app with sdk 21 the padding is not working in lower apis.

2) searchView.setPadding(40, 0, 55, 0);

This sets the padding in pixels, and you won't notice the difference if you run it in high denisty devices. Try setting padding in dp

int paddingLeft = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 40, getResources().getDisplayMetrics());
        int paddingRight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 55, getResources().getDisplayMetrics());
        int paddingTop = editText.getPaddingTop();
        int paddingBottom = editText.getPaddingBottom();
        editText.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);

Upvotes: 5

Related Questions