iamthevoid
iamthevoid

Reputation: 438

Float Label hint (TextInputLayout) not works with Android Data Binding

I need create fields edit page in app. There are list of EditText for edit Contact. For each field type i have an layout. As example - for name and last name it is float labeled edit text. For facebook - simple edit text with icon. I am creating this list with Android Data Binding Library

I've created layout

<data>

    <variable
        name="item"
        type="app.core.db.model.Field" />
</data>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="65dp"
        app:hintTextAppearance="@style/TextAppearence.App.TextInputLayout"
        app:theme="@style/EditFieldFloatLabeled">

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ellipsize="end"
            android:hint="@{item.getHint()}"
            android:imeOptions="actionNext"
            android:maxLines="1" />
    </android.support.design.widget.TextInputLayout>

</FrameLayout>

But float label not works. I starts commenting line by line to find out reason. Float label became work when I've commented line

android:hint="@{item.getHint()}

(And replace it with hardcoded text). getHint() returns R.string.{something} based on field type.

There I've found out than programmatically setting hint produce float label disappearing. I can not use static layout (instead recycler view) because fields list can increase dynsmically (ex: I am writing phone number in field and empty Phone field inserts after it for other phone number).

Is there way to create float label same way (by defining hint with field type)?

Upvotes: 7

Views: 2121

Answers (3)

Gui Silva
Gui Silva

Reputation: 1441

The answer given by FerdyRod is the correct one.

The problem is that when TextInputLayout is being created it tries to read the hint from it's EditText and from this point forward it's not reading it ever again. TextInputLayout

    ...
    // If we do not have a valid hint, try and retrieve it from the EditText
    if (TextUtils.isEmpty(mHint)) {
        setHint(mEditText.getHint());
        // Clear the EditText's hint as we will display it ourselves
        mEditText.setHint(null);
    }

So, data binding is indeed updating the hint but the wrong one (EditText hint) that TextInputLayout doesn't read anymore

Upvotes: 1

FerdyRod
FerdyRod

Reputation: 1066

I had the same problem.

The solution is setting the hint with the data binding on the TextInputLayout.

<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="65dp"
    android:hint="@{item.getHint()}"
    app:hintTextAppearance="@style/TextAppearence.App.TextInputLayout"
    app:theme="@style/EditFieldFloatLabeled">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ellipsize="end"
        android:imeOptions="actionNext"
        android:maxLines="1" />
</android.support.design.widget.TextInputLayout>

Upvotes: 14

George Mount
George Mount

Reputation: 20926

The problem is that when nothing is assigned, 0 will be given as the resource ID. you're probably seeing an exception like this in your logcat:

android.content.res.Resources$NotFoundException: String resource ID #0x0

It is likely that you haven't assigned a value to the item before the first evaluation of the expression. You should assign the item immediately after creating the binding if you want to ensure that the resource isn't set to the value 0.

MyBinding binding = MyBinding.inflate(inflater, parent, true);
binding.setItem(item);

Upvotes: 0

Related Questions