Dengan menggunakan data binding satu arah, Anda dapat menetapkan nilai pada atribut pemroses yang bereaksi terhadap perubahan atribut tersebut:
<CheckBox android:id="@+id/rememberMeCheckBox" android:checked="@{viewmodel.rememberMe}" android:onCheckedChanged="@{viewmodel.rememberMeChanged}" />
Data binding dua arah menyediakan pintasan ke proses ini:
<CheckBox android:id="@+id/rememberMeCheckBox" android:checked="@={viewmodel.rememberMe}" />
Notasi @={}
, yang penting menyertakan karakter "=" menerima data,
perubahan pada properti dan secara bersamaan
memproses pembaruan pengguna.
Untuk bereaksi terhadap perubahan data pendukung, Anda dapat membuat tata letak
variabel implementasi Observable
, biasanya
BaseObservable
, dan gunakan
@Bindable
, seperti yang ditunjukkan di
cuplikan kode berikut:
Kotlin
class LoginViewModel : BaseObservable { // val data = ... @Bindable fun getRememberMe(): Boolean { return data.rememberMe } fun setRememberMe(value: Boolean) { // Avoids infinite loops. if (data.rememberMe != value) { data.rememberMe = value // React to the change. saveData() // Notify observers of a new value. notifyPropertyChanged(BR.remember_me) } } }
Java
public class LoginViewModel extends BaseObservable { // private Model data = ... @Bindable public Boolean getRememberMe() { return data.rememberMe; } public void setRememberMe(Boolean value) { // Avoids infinite loops. if (data.rememberMe != value) { data.rememberMe = value; // React to the change. saveData(); // Notify observers of a new value. notifyPropertyChanged(BR.remember_me); } } }
Karena metode pengambil properti bindable disebut getRememberMe()
, metode ini
metode penyetel yang sesuai untuk properti ini akan otomatis menggunakan nama
setRememberMe()
.
Untuk informasi selengkapnya tentang penggunaan BaseObservable
dan @Bindable
, lihat Bekerja dengan
objek data yang dapat diamati.
Data binding dua arah menggunakan atribut khusus
Platform ini menyediakan implementasi data binding dua arah untuk
atribut dua arah dan mengubah pemroses, yang dapat Anda gunakan
sebagai bagian dari aplikasi Anda. Jika Anda ingin menggunakan data binding dua arah dengan
Anda harus bekerja dengan
@InverseBindingAdapter
dan
@InverseBindingMethod
anotasi.
Misalnya, jika Anda ingin mengaktifkan data binding dua arah pada atribut "time"
dalam tampilan kustom bernama MyView
, selesaikan langkah-langkah berikut:
Anotasikan metode yang menetapkan nilai awal dan melakukan pembaruan saat nilai perubahan menggunakan
@BindingAdapter
:Kotlin
@BindingAdapter("time") @JvmStatic fun setTime(view: MyView, newValue: Time) { // Important to break potential infinite loops. if (view.time != newValue) { view.time = newValue } }
Java
@BindingAdapter("time") public static void setTime(MyView view, Time newValue) { // Important to break potential infinite loops. if (view.time != newValue) { view.time = newValue; } }
Anotasikan metode yang membaca nilai dari tampilan menggunakan
@InverseBindingAdapter
:Kotlin
@InverseBindingAdapter("time") @JvmStatic fun getTime(view: MyView) : Time { return view.getTime() }
Java
@InverseBindingAdapter("time") public static Time getTime(MyView view) { return view.getTime(); }
Pada tahap ini, data binding tahu apa yang harus dilakukan ketika data berubah (ia memanggil
yang dianotasikan bersama
@BindingAdapter
) dan hal yang harus
panggil saat atribut tampilan berubah (ia memanggil metode
InverseBindingListener
)
Namun, model ini tidak mengetahui kapan atau bagaimana atribut berubah.
Untuk itu, Anda perlu menetapkan pemroses pada tampilan. Ini dapat menjadi pemroses kustom
yang terkait dengan tampilan kustom, atau dapat berupa peristiwa umum, seperti kehilangan
fokus atau perubahan teks. Menambahkan anotasi @BindingAdapter
ke metode
yang menetapkan pemroses untuk perubahan pada properti:
Kotlin
@BindingAdapter("app:timeAttrChanged") @JvmStatic fun setListeners( view: MyView, attrChange: InverseBindingListener ) { // Set a listener for click, focus, touch, etc. }
Java
@BindingAdapter("app:timeAttrChanged") public static void setListeners( MyView view, final InverseBindingListener attrChange) { // Set a listener for click, focus, touch, etc. }
Pemroses ini menyertakan InverseBindingListener
sebagai parameter. Anda menggunakan
InverseBindingListener
untuk memberi tahu sistem data binding bahwa atribut memiliki
ubah. Selanjutnya, sistem dapat mulai memanggil metode yang dianotasi menggunakan
@InverseBindingAdapter
, dan sebagainya.
Dalam praktiknya, pemroses ini menyertakan beberapa logika yang sulit, termasuk pemroses
untuk data binding satu arah. Sebagai contoh, lihat adaptor untuk atribut teks
mengubah,
TextViewBindingAdapter
Converter
Jika variabel yang terikat ke objek View
perlu diformat, diterjemahkan, atau diubah entah bagaimana sebelum ditampilkan,
Anda dapat menggunakan objek Converter
.
Misalnya, ambil objek EditText
yang menampilkan tanggal:
<EditText
android:id="@+id/birth_date"
android:text="@={Converter.dateToString(viewmodel.birthDate)}"
/>
Atribut viewmodel.birthDate
berisi nilai jenis Long
, sehingga diperlukan
diformat menggunakan pengonversi.
Karena ekspresi dua arah digunakan, ada parameter invers
pengonversi untuk memberi tahu library cara mengonversi kembali string yang disediakan pengguna
ke jenis data pendukung, dalam hal ini Long
. Proses ini dilakukan
dengan menambahkan
anotasi @InverseMethod
ke salah satu pelaku konversi dan membuat anotasi ini mereferensikan invers
pengonversi. Contoh konfigurasi ini muncul dalam kode berikut
snippet:
Kotlin
object Converter { @InverseMethod("stringToDate") @JvmStatic fun dateToString( view: EditText, oldValue: Long, value: Long ): String { // Converts long to String. } @JvmStatic fun stringToDate( view: EditText, oldValue: String, value: String ): Long { // Converts String to long. } }
Java
public class Converter { @InverseMethod("stringToDate") public static String dateToString(EditText view, long oldValue, long value) { // Converts long to String. } public static long stringToDate(EditText view, String oldValue, String value) { // Converts String to long. } }
Loop tak terbatas menggunakan data binding dua arah
Berhati-hatilah agar tidak menimbulkan loop tak terbatas saat menggunakan data binding dua arah. Kapan
pengguna mengubah atribut, metode yang dianotasi menggunakan
@InverseBindingAdapter
dipanggil, dan nilainya ditetapkan ke pendukung
saat ini. Selanjutnya, akan memanggil metode yang dianotasikan menggunakan
@BindingAdapter
, yang akan memicu panggilan lain ke metode yang dianotasi
menggunakan @InverseBindingAdapter
, dan seterusnya.
Karena alasan ini, penting untuk memutus kemungkinan
perputaran tak terbatas dengan membandingkan
nilai baru dan lama dalam metode yang dianotasi menggunakan @BindingAdapter
.
Atribut dua arah
Platform ini menyediakan dukungan bawaan untuk data binding dua arah saat Anda menggunakan atribut dalam tabel berikut. Untuk detail tentang cara platform menyediakan dukungan ini, lihat implementasi untuk adaptor binding yang sesuai:
Class | Atribut | Adaptor binding |
---|---|---|
AdapterView
|
android:selectedItemPosition android:selection |
AdapterViewBindingAdapter
|
CalendarView |
android:date |
CalendarViewBindingAdapter
|
CompoundButton |
android:checked
|
CompoundButtonBindingAdapter
|
DatePicker
|
android:year android:month android:day |
DatePickerBindingAdapter
|
NumberPicker |
android:value
|
NumberPickerBindingAdapter
|
RadioButton
|
android:checkedButton |
RadioGroupBindingAdapter
|
RatingBar
|
android:rating
|
RatingBarBindingAdapter
|
SeekBar
|
android:progress |
SeekBarBindingAdapter
|
TabHost
|
android:currentTab |
TabHostBindingAdapter
|
TextView
|
android:text
|
TextViewBindingAdapter
|
TimePicker
|
android:hour android:minute |
TimePickerBindingAdapter
|
Referensi lainnya
Untuk mempelajari data binding lebih lanjut, lihat referensi berikut resource tambahan.
Contoh
Codelab
Postingan blog
Direkomendasikan untuk Anda
- Catatan: teks link ditampilkan saat JavaScript nonaktif
- Bekerja dengan objek data yang dapat diamati
- Tata letak dan ekspresi binding
- Mengikat tampilan tata letak ke Komponen Arsitektur