6

我正在查看適用於Android的新數據綁定插件並嘗試將其集成到項目中。無法從xml佈局引用Observable Class字段

在閱讀有關創建觀察對象,我遇到了使用自包含的觀察對象例如從文件涉及的ObservableFields文檔:

public class User extends BaseObservable { 
    public final ObservableField<String> firstName = 
     new ObservableField<>(); 
    public final ObservableField<String> lastName = 
     new ObservableField<>(); 
    public final ObservableInt age = new ObservableInt(); 
} 

上面的代碼將是一個替代的:

private static class User extends BaseObservable { 
    private String firstName; 
    private String lastName; 
    @Bindable 
    public String getFirstName() { 
     return this.firstName; 
    } 
    @Bindable 
    public String getFirstName() { 
     return this.lastName; 
    } 
    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
     notifyPropertyChanged(BR.firstName); 
    } 
    public void setLastName(String lastName) { 
     this.lastName = lastName; 
     notifyPropertyChanged(BR.lastName); 
    } 
} 

這是少得多的代碼;但是,使用可觀測場和參考時,然後從XML佈局像這樣:

<layout xmlns:android="http://schemas.android.com/apk/res/android"> 
    <data> 
     <variable name="user" type="com.example.User"/> 
    </data> 
    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <TextView android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@{user.lastName}" 
      android:id="@+id/lastName"/> 

    </LinearLayout> 
</layout> 

我收到此錯誤:

../../databinding/ActivityMainBinding.java 
Error:(127, 20) error: cannot find symbol variable lastName 

而不是冗長可言; 不使用ObservableFields就像一個魅力。

Documentation reference

任何人都面臨着這樣的問題?思考?

+0

請爲佈局發佈xml嗎? – fakataha

+0

@atamakosi我們走吧! –

+0

我們是否需要在第一種情況下添加擴展「BaseObservable」? – Debanjan

回答

5

這看起來像我們這邊出了錯誤。我聽說添加@Bindable修復了這個問題,但數據綁定應該能夠找到它,而不是Bindable註釋。我內部創建了一個bug,謝謝。

+3

謝謝你。也許值得暫時更新可綁定的文檔?歡呼 –

+1

fyi,修復將在rc1中發佈 – yigit

1

ObservableField需要用@Bindable註釋進行註釋才能編譯。

來源爲可綁定註釋狀態:

this is necessary for java analyzer to work

所以它結束了看起來像這樣:

public class User extends BaseObservable { 
    @Bindable 
    public final ObservableField<String> firstName = 
     new ObservableField<>(); 
    @Bindable 
    public final ObservableField<String> lastName = 
     new ObservableField<>(); 
    @Bindable 
    public final ObservableInt age = new ObservableInt(); 
} 
相關問題