2017-06-01 106 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 *接口的基类或接口,将不会观察变量!

所以没有机会使用接口。我必须使用上面答案中提到的抽象类。