Float Label提示(TextInputLayout)不适用于Android数据绑定

时间:2017-07-07 09:46:04

标签: android data-binding android-databinding android-textinputlayout

我需要在app中创建字段编辑页面。有编辑联系人的EditText列表。对于每种字段类型,我都有一个布局。例如 - 对于名称和姓氏,它是浮动标记的编辑文本。对于Facebook - 简单的编辑文本与图标。我正在使用Android数据绑定库创建此列表

我已经创建了布局

<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>

但浮标不起作用。我开始逐行评论以找出原因。当我评论行

时,浮动标签就开始工作了
android:hint="@{item.getHint()}

(并用硬编码文本替换它)。 getHint()根据字段类型返回R.string.{something}

在那里我发现了比以编程方式设置提示产生浮动标签消失。我不能使用静态布局(而不是回收者视图),因为字段列表可能会出现dynsmically(例如:我在字段中写入电话号码,而在其他电话号码后插入空电话字段)。

有没有办法以相同的方式创建浮动标签(通过使用字段类型定义提示)?

3 个答案:

答案 0 :(得分:10)

我遇到了同样的问题。

解决方案是使用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>

答案 1 :(得分:0)

问题在于,当没有分配任何内容时,将给出0作为资源ID。您可能在logcat中看到这样的异常:

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

在第一次评估表达式之前,您可能没有为项目分配值。如果要确保资源未设置为值0,则应在创建绑定后立即分配项目。

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

答案 2 :(得分:0)

FerdyRod 给出的答案是正确的。

问题在于,当创建TextInputLayout时,它将尝试从其EditText中读取提示,并且从现在开始,它将不再读取该提示。 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);
    }

因此,数据绑定的确在更新提示,但TextInputLayout不再读取错误的提示(EditText提示)