今天我发现了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>
但是,在尝试为enabled
的{{1}} / clickable
属性实施类似逻辑时,我收到以下错误:
错误:
ImageButton
:java.lang.RuntimeException
:发现数据绑定错误。 **** /数据绑定错误****消息:标识符必须具有XML文件中的用户定义类型。java.lang.RuntimeException
遗漏了它
问题肯定在于这两行,因为删除它们可以正确创建绑定类。
我的问题是:
我也尝试过不同的做法,但结果是一样的:
new_message_input
答案 0 :(得分:7)
卫生署。
我认为数据绑定过程会将XML ID转换为Binding类中的属性,所有这些都是用较低的驼峰编写的。这意味着,为了使用数据绑定从<?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())}"/>
内引用"@id/new_message_input"
,我应该使用生成的名称,在本例中为"@id/btn_send_message"
。
这个示例并不是立即明显的,因为它包含newMessageInput
View
已经在 camelCase 中,因此与生成的名称相同 - 因此自动运行。
因此,解决方案是替换这些行:
@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
),在布局膨胀时,正确使按钮不可点击。