2017-06-01 134 views
2

我有一個片段,其文本字段將由X1Object或X2Object填充,它們都實現IXObject接口並擴展由Android DataBinding庫提供的BaseObservable類,但包含其他不同的字段和行爲。 IXObject包含獲取者和設置者的方法。如何使用android數據綁定來綁定一個接口?

public interface IXObject { 
    void setName(String name); 
    String getName(); 
} 

public class X1Object extends BaseObservable implements IXObject { 
    private String name; 

    @Override 
    @Bindable 
    public String getName() { 
     return name; 
    } 

    @Override 
    public void setName(String name) { 
     this.name = name; 
     notifyPropertyChanged(BR.name); 
    } 
} 

public class X2Object extends BaseObservable implements IXObject {...} 

然後,我試圖使用Android DataBinding的片段使用單個佈局文件。佈局看起來像這樣:

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools"> 

<data> 
    <variable name="xObject" type="com.test.x.model.IXObject"/> 
</data> 

<LinearLayout 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TextView 
     android:id="@+id/name" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="@{xObject.name}"/> 

</LinearLayout> 
</layout> 

在片段類,我申請的結合:

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    MyFragmentBinding binding = DataBindingUtil.inflate(inflater, R.layout.my_fragment, container, false); 

    View view = binding.getRoot(); 

    IXObject xobj = new X1Object(); 
    binding.setXObject(xobject); 

    return view; 
} 

不幸的是,使用IXObject作爲數據綁定參考,在BaseObservable類方法「addOnPropertyChangedCallback」永遠不會被調用。

直接在佈局文件和綁定類中使用X1Object進行綁定,一切正常。

你能幫助我如何實現我的目標,使用綁定界面?

謝謝。

回答

1

我也無法找到使它與界面一起工作的方式,但我認爲你可以像這樣使用Abstract類。

public abstract class IXObject extends BaseObservable { 
    public abstract void setName(String name); 

    @Bindable 
    public abstract String getName(); 
} 

public class X1Object extends IXObject { 
    private String name; 

    @Override 
    public String getName() { 
     return name; 
    } 

    @Override 
    public void setName(String name) { 
     this.name = name; 
     notifyPropertyChanged(BR.name); 
    } 
} 

final IXObject xobj = new X1Object(); 
xobj.setName("nguyen"); 
binding.setXObject(xobj); 
0

我想我找到了我的問題的根源。根據數據綁定文件,在佈局中的每個變量集合必須實現可觀察接口:

的變量類型是在編譯時檢查,因此,如果一個變量實現可觀察的或是可觀察到的集合時,該應反映在類型中。如果變量是不實現Observable *接口的基類或接口,將不會觀察變量!

所以沒有機會使用接口。我必須使用上面答案中提到的抽象類。