使用数据绑定和 lambda 的单选按钮 onCheckedChanged
RadioButton onCheckedChanged with DataBinding and lambdas
我有一个单选按钮:
<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}"
没问题 - 它有效。
不能在数据绑定表达式中使用语句。这包括大括号或 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
关键字表示没有 return 值。这是有效的,因为 onCheckedChanged()
有一个 void
return 值。如果您绑定到一个需要 return 值(如 onLongClick()
)的侦听器,您将使用该侦听器的 return 类型——true
或 false
onLongClick()
您应该尽量避免在数据绑定表达式中使用复杂的逻辑。选择不支持语句是为了尝试限制绑定表达式的复杂性。
我有一个单选按钮:
<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}"
没问题 - 它有效。
不能在数据绑定表达式中使用语句。这包括大括号或 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
关键字表示没有 return 值。这是有效的,因为 onCheckedChanged()
有一个 void
return 值。如果您绑定到一个需要 return 值(如 onLongClick()
)的侦听器,您将使用该侦听器的 return 类型——true
或 false
onLongClick()
您应该尽量避免在数据绑定表达式中使用复杂的逻辑。选择不支持语句是为了尝试限制绑定表达式的复杂性。