у меня есть ситуация, когда у меня есть фрагмент, чьи текстовые поля будут заполнены либо X1Object, либо X2Object, которые оба реализуют интерфейс IXObject и расширяют класс BaseObservable, предоставляемый библиотекой Android DataBinding, но содержат дополнительные различные поля и поведение. IXObject содержит методы для геттеров и сеттеров.
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 в качестве ссылки на привязку данных метод addOnPropertyChangedCallback в классе BaseObservable никогда не вызывается.
Используя X1Object напрямую для привязки в файле макета и классе привязки, все работает отлично.
Можете ли вы помочь мне, как достичь моей цели, чтобы использовать интерфейс для привязки?
Спасибо.