【问题标题】:Two-Way Data Binding: View is missing user defined type双向数据绑定:视图缺少用户定义类型
【发布时间】:2016-07-13 18:36:46
【问题描述】:

今天我在 Android Studio 预览版中发现了最近引入的 two-way data binding 功能,并决定试一试。

我有一个非常简单的布局(下面的代码),用于编写和发送消息。我想要实现的是在字段中没有输入文本时使用按钮“disabled”(并且将来会相应地有一些不同的图像)。

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

但是,当尝试为 ImageButtonenabled/clickable 属性实现类似的逻辑时,我收到以下错误:

错误:java.lang.RuntimeExceptionjava.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())}"/>

【问题讨论】:

    标签: android android-layout data-binding android-view 2-way-object-databinding


    【解决方案1】:

    Doh.

    我突然想到了数据绑定过程将 XML ID 转换为 Binding 类中的属性,所有这些都是用小驼峰式编写的。这意味着为了使用数据绑定从"@id/btn_send_message" 中引用"@id/new_message_input",我应该使用生成的名称,在本例中为newMessageInput

    这在示例中并没有立即显现出来,因为它包含一个 View,其 @id 已经在 camelCase 中,因此与生成的名称相同 - 因此可以自动工作。

    因此,解决方案是替换这些行:

        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 最初是空的(因此我们希望按钮被禁用),我们应该将一个空的String 对象附加到视图(通过Java;例如StringUtils.EMPTY),在布局膨胀,正确地使按钮不可点击。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      • 2016-12-24
      • 2015-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多