2016-12-06 102 views
1

我有一个单选按钮:单选按钮与数据绑定和lambda表达式onCheckedChanged

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

如果我使用

​​

没有问题 - 它的工作原理。

回答

3

不能使用数据绑定表达式语句。这包括花括号或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()返回值,你可以使用该侦听器,而不是返回类型 - truefalseonLongClick()

你应该尽量避免使用内部数据绑定表达式复杂的逻辑。不支持语句的选择是试图限制绑定表达式的复杂性。

+0

这工作,谢谢。我有另一个调用该类(它是BaseObservable类型)的函数的问题,所以我需要通过另一个类将该调用重新路由到q.setB(),该类也在布局文件中注册。但这是我想的另一个问题。 – rajath