如何使用android数据绑定来绑定接口?

sne*_*eps 5 data-binding android

我遇到的情况是我有一个片段,它的文本字段将由X1Object或X2Object填充,它们都实现了IXObject接口并扩展了Android DataBinding库提供的BaseObservable类,但是包含其他不同的字段和行为。IXObject包含用于getter和setter的方法。

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 {...}
Run Code Online (Sandbox Code Playgroud)

然后,我尝试使用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>
Run Code Online (Sandbox Code Playgroud)

在片段类中,我正在应用绑定:

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;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,使用IXObject作为数据绑定引用,从不调用BaseObservable类中的方法“ addOnPropertyChangedCallback”。

直接使用X1Object在布局文件和绑定类中进行绑定,一切都可以完美地工作。

您能帮助我如何实现使用接口进行绑定的目标吗?

谢谢。

Pha*_*inh 4

我也找不到让它与接口一起工作的方法,但我认为你可以像这样使用抽象类。

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

    @Bindable
    public abstract String getName();
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

final IXObject xobj = new X1Object();
xobj.setName("nguyen");
binding.setXObject(xobj);
Run Code Online (Sandbox Code Playgroud)