android - 使用数据绑定(bind)和 lambda 的单选按钮 onCheckedChanged

标签 android data-binding android-databinding

我有一个单选按钮:

<RadioButton
    android:id="@+id/rdioA"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:checked="@{!q.b}"
    android:onCheckedChanged="@{(cb, isChecked) -> {if (isChecked) q.setB(false)}}"
    android:text="AAA"/>

变量“q”定义为:

<data>
    <import type="android.view.View"/>
    <variable name="q" type="com.example.Q"/>
</data>

Q.java中的函数是:

public void setB(boolean b) {
    this.b = b;
}

我得到的编译错误是:

/Users/../view_d.xml
Error:(60, 53) Syntax error: extraneous input '=' expecting {<EOF>, '.', '::', '[', '+', '-', '*', '/', '%', '<<', '>>>', '>>', '<=', '>=', '>', '<', 'instanceof', '==', '!=', '&', '^', '|', '&&', '||', '?', '??'} 
Error:Execution failed for task ':app:compileDevDebugJavaWithJavac'.
> java.lang.RuntimeException: Found data binding errors.

如果我用

android:onCheckedChanged="@{q::onCheckedChanged}"

没有问题 - 它有效。

最佳答案

您不能在数据绑定(bind)表达式中使用语句。这包括花括号或 if 语句。改用这个:

<RadioButton
    android:id="@+id/rdioA"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:checked="@{!q.b}"
    android:onCheckedChanged="@{(cb, isChecked) -> (isChecked) ? q.setB(false) : void}"
    android:text="AAA"/>

您可以使用三元表达式来替换 if 语句。如果什么都不做,可以使用void关键字来表示没有返回值。这是有效的,因为 onCheckedChanged() 有一个 void 返回值。如果您绑定(bind)到一个需要返回值的监听器,如 onLongClick(),您将使用该监听器的返回类型来代替——truefalse 用于 onLongClick()

您应该尽量避免在数据绑定(bind)表达式中使用复杂的逻辑。选择不支持语句是为了尝试限制绑定(bind)表达式的复杂性。

关于android - 使用数据绑定(bind)和 lambda 的单选按钮 onCheckedChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40986456/

相关文章:

android - addProximityAlert 不起作用(requestLocationUpdates 也不起作用)- Android

android - 配置 Android Studio 模块以使用 Google API

.net - 如何将 DataTable.Select() 的结果绑定(bind)到 ListBox 控件?

WPF:TextBlock 中的部分数据绑定(bind)

c# - ViewModel 属性在其对应的 CustomControl 属性更新时未更新

android - 为什么有数据绑定(bind)的recyclerview 有时UI 更新失败?

android - 数据绑定(bind)在等待 Android 中填充值时显示未填充的值

java - 如何在android中正确使用编辑文本更改监听器?

java - Android GridView 字符串对齐问题

Android - 使用数据绑定(bind)的条件文本值