При двусторонней привязке данных вам нужно создать класс, который начинается с BaseObservable
, аннотировать геттеры с помощью @Bindable
и вызывать notifyPropertyChanged
в ваших установщиках, как показано ниже:
public class Person extends BaseObservable {
private String name;
Person(String name) {
this.name = name;
}
@Bindable
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
notifyPropertyChanged(BR.name);
}
}
Затем передать этот класс как переменная макета привязки данных типа Person
.
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="person"
type="com.example.android......Person" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@={person.name}" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{person.name}" />
</LinearLayout>
</layout>
Примечание: измените путь к классу в атрибуте type
.
, а затем установите эту переменную макета в своей деятельности с setPerson()
public class ExampleActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DataBindingUtil.setContentView(this, R.layout.activity_example);
ActivityExampleBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_example);
mActivityMainBinding.setPerson(new Person(""));
}
}