使用数据绑定和Lambda表达式实现RadioButton的onCheckedChanged事件

5

我有一个单选按钮:

<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;
}

The compilation error i get is:

/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}"

没有问题 - 它有效。

1个回答

7

您不能在数据绑定表达式中使用语句。这包括花括号或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返回值。如果您绑定到期望返回值的侦听器,如onLongClick(),则应使用该侦听器的返回类型--对于onLongClick(),使用truefalse

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


可以,谢谢。我在调用那个类(类型为BaseObservable)的函数时遇到了另一个问题,所以我需要通过另一个类重新路由q.setB()的调用,这个类也在布局文件中注册。但这是另一个问题,我想。 - Rajath

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