2016-12-06 66 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