双向数据绑定:视图缺少用户定义类型。

3
今天我了解到Android Studio预览版中最近引入的双向数据绑定功能,决定尝试一下。
我有一个非常简单的布局(见下面的代码),用于撰写和发送消息。我想实现的是,在字段中没有输入文本时,将按钮“禁用”(并在将来根据需要使用不同的图像) 。
<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:android="http://schemas.android.com/apk/res/android">
<data>
    <variable name="msg" type="String"/>
</data>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <EditText
        android:id="@+id/new_message_input"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:paddingStart="10dp"
        android:hint="@string/hint_compose_message"
        android:inputType="textAutoCorrect|textMultiLine"
        android:text="@={msg}"/>
    <ImageButton
        android:id="@+id/btn_send_message"
        android:layout_width="50dp"
        android:layout_height="match_parent"
        android:src="@drawable/ic_send"
        android:enabled="@{!new_message_input.text.isEmpty()}"
        android:clickable="@{!new_message_input.text.isEmpty()}"/>
</LinearLayout>
</layout>

第一个链接中的示例代码表明,类似以下内容应该足够:
<layout ...>
  <data>
    <import type="android.view.View"/>
  </data>
  <RelativeLayout ...>
    <CheckBox android:id="@+id/seeAds" .../>
    <ImageView android:visibility="@{seeAds.checked ? View.VISIBLE : View.GONE}" .../>
  </RelativeLayout>
</layout>

然而,当尝试为ImageButton的enabled / clickable属性实现类似的逻辑时,我遇到了以下错误:
错误:java.lang.RuntimeException: java.lang.RuntimeException:发现数据绑定错误。 ****/数据绑定错误**** msg:标识符必须具有来自XML文件的用户定义类型。new_message_input缺失它
问题明显出在这两行代码上,因为删除它们可以正确创建绑定类。
我的问题是:
  • 我做错了什么?
  • 如何解决这个问题?

我也试着用不同的方法做,但结果还是一样的:

<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
    <import type="android.widget.EditText"/>
    ...
</data>
<LinearLayout
  ...
  <ImageButton
    ...
    android:enabled="@{!(((EditText)new_message_input).getText().toString().isEmpty())}"
    android:clickable="@{!(((EditText)new_message_input).getText().toString().isEmpty())}"/>
1个回答

7

啊,我犯了个错误。

我忘记了数据绑定过程会将XML ID转换为Binding类中的属性,这些属性都是小驼峰命名法。这意味着,如果想要在数据绑定中从"@id/btn_send_message"引用"@id/new_message_input",应该使用生成的名称,在这种情况下,生成的名称是newMessageInput

由于示例中包含一个视图,其@id已经采用了驼峰命名法,因此与生成的名称相同 - 因此能够自动工作。

解决方法是替换以下代码:

    android:enabled="@{!new_message_input.text.isEmpty()}"
    android:clickable="@{!new_message_input.text.isEmpty()}"/>

使用:

    android:enabled="@{!newMessageInput.text.isEmpty()}"
    android:clickable="@{!newMessageInput.text.isEmpty()}"/>

我可以完全避免这个问题,只需要执行以下操作:
    android:enabled="@{!msg.isEmpty()}"
    android:clickable="@{!msg.isEmpty()}"/>

顺便提一下:

如果EditText最初是空的(因此我们期望按钮被禁用),我们应该通过Java将一个空的String对象附加到视图上(例如StringUtils.EMPTY),在布局膨胀时,以正确地使按钮无法点击。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接