단방향 데이터 결합을 사용하면 속성에 값을 설정하고 리스너입니다.
<CheckBox android:id="@+id/rememberMeCheckBox" android:checked="@{viewmodel.rememberMe}" android:onCheckedChanged="@{viewmodel.rememberMeChanged}" />
다음과 같이 양방향 데이터 결합은 이 프로세스의 바로가기를 제공합니다.
<CheckBox android:id="@+id/rememberMeCheckBox" android:checked="@={viewmodel.rememberMe}" />
'=' 기호가 포함된 @={}
표기법 기호, 데이터 수신
동시에 사용자 업데이트를 리슨합니다.
지원 데이터의 변경사항에 반응하려면 레이아웃을 만들면 됩니다.
Observable
구현을 변수로 지정합니다. 일반적으로
BaseObservable
을 입력하고
@Bindable
주석(아래 참고)
다음 코드 스니펫입니다.
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) } } }
자바
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); } } }
결합 가능한 속성의 getter 메서드는 getRememberMe()
라고 하므로
속성의 해당 setter 메서드는 자동으로
setRememberMe()
BaseObservable
및 @Bindable
사용에 대한 자세한 내용은
관찰 가능한 데이터 객체를 사용합니다.
맞춤 속성을 사용한 양방향 데이터 결합
플랫폼에서는 가장 일반적인
양방향 속성을 사용하고 변경 리스너의
삽입해야 합니다. 커스텀 모델을 통해 양방향 데이터 결합을 사용하려는 경우
속성을 사용하려면 먼저
@InverseBindingAdapter
및
@InverseBindingMethod
주석을 달 수 있습니다.
예를 들어 "time"
속성에 양방향 데이터 결합을 사용 설정하려는 경우
MyView
라는 맞춤 뷰에서 다음 단계를 완료합니다.
초깃값을 설정하고 값이 변경될 때 업데이트하는 메서드에 주석을 추가합니다.
@BindingAdapter
를 사용한 변경사항:Kotlin
@BindingAdapter("time") @JvmStatic fun setTime(view: MyView, newValue: Time) { // Important to break potential infinite loops. if (view.time != newValue) { view.time = newValue } }
자바
@BindingAdapter("time") public static void setTime(MyView view, Time newValue) { // Important to break potential infinite loops. if (view.time != newValue) { view.time = newValue; } }
뷰에서 값을 읽는 메서드에 다음을 사용하여 주석을 추가합니다.
@InverseBindingAdapter
:Kotlin
@InverseBindingAdapter("time") @JvmStatic fun getTime(view: MyView) : Time { return view.getTime() }
자바
@InverseBindingAdapter("time") public static Time getTime(MyView view) { return view.getTime(); }
이 시점에서 데이터 결합은 데이터가 변경될 때 해야 할 작업을 알고 있습니다. 즉,
주석이 달린 메서드
@BindingAdapter
) 및 수행할 작업
뷰 속성이 변경될 때 호출(
InverseBindingListener
)
그러나 속성이 언제 또는 어떻게 변경되는지는 알 수 없습니다.
속성의 변경 시기 또는 방식을 알기 위해서는 뷰에 리스너를 설정해야 합니다. 커스텀 리스너일 수도 있고
맞춤 뷰와 연결된 이벤트이거나 손실과 같은 일반 이벤트일 수 있습니다.
영향을 줄 수 있습니다. 메서드에 @BindingAdapter
주석을 추가합니다.
- 속성 변경의 리스너를 설정합니다.
Kotlin
@BindingAdapter("app:timeAttrChanged") @JvmStatic fun setListeners( view: MyView, attrChange: InverseBindingListener ) { // Set a listener for click, focus, touch, etc. }
자바
@BindingAdapter("app:timeAttrChanged") public static void setListeners( MyView view, final InverseBindingListener attrChange) { // Set a listener for click, focus, touch, etc. }
리스너에는 InverseBindingListener
가 매개변수로 포함됩니다. 사용자는
InverseBindingListener
: 데이터 결합 시스템에 속성이
변경할 수 있습니다. 그러면 시스템은
@InverseBindingAdapter
등
실제로 이 리스너에는 리스너를 포함하여 중요한 로직이 포함되어 있습니다.
사용할 수 있습니다. 예를 보려면 텍스트 속성의 어댑터를 참조하세요.
변경,
TextViewBindingAdapter
전환수
View
객체에 결합된 변수가
어떻게든 형식 지정, 번역 또는 변경이 이루어져야 하는 경우
Converter
객체를 사용할 수 있습니다.
예를 들어 날짜를 보여주는 EditText
객체를 사용합니다.
<EditText
android:id="@+id/birth_date"
android:text="@={Converter.dateToString(viewmodel.birthDate)}"
/>
viewmodel.birthDate
속성에는 Long
유형의 값이 포함되어 있으므로
포맷해야 합니다.
양방향 표현식이 사용되기 때문에 역방향 표현식도 포함되어야 합니다.
변환기를 만들어 사용자가 제공한 문자열을 다시 변환하는 방법을 라이브러리에 알립니다.
지원 데이터 유형(이 경우 Long
)에 추가합니다. 이 프로세스는
@InverseMethod
주석
변환하고 이 주석이 역을 참조하도록 합니다.
전환할 수 있습니다 이 구성의 예는 다음 코드에 나와 있습니다.
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. } }
자바
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. } }
양방향 데이터 결합을 사용하는 무한 루프
양방향 데이터 결합을 사용할 때 무한 루프가 발생하지 않도록 주의해야 합니다. 날짜
사용자가 속성을 변경하면
@InverseBindingAdapter
가 호출되고 값이 지원에 할당됨
속성 그러면 결과적으로
@BindingAdapter
- 주석이 달린 메서드의 또 다른 호출을 트리거합니다.
@InverseBindingAdapter
등을 사용합니다.
따라서 가능한 무한 루프를 끊는 것이 중요합니다.
@BindingAdapter
를 사용하여 주석이 달린 메서드의 새 값과 이전 값 포함
양방향 속성
플랫폼에서는 다음 표의 속성입니다. 플랫폼에서 제공하는 자세한 내용은 해당 결합 어댑터의 구현을 참조하세요.
클래스 | 속성 | 결합 어댑터 |
---|---|---|
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
|
추가 리소스
데이터 결합에 관한 자세한 내용은 다음을 참고하세요. 추가 리소스를 확인해 보세요.
샘플
Codelab
- <ph type="x-smartling-placeholder"></ph> Android 데이터 결합 Codelab
블로그 게시물
추천 서비스
- 참고: JavaScript가 사용 중지되어 있으면 링크 텍스트가 표시됩니다.
- 관측 가능한 데이터 객체로 작업
- 레이아웃 및 바인딩 수식
- 아키텍처 구성요소에 레이아웃 뷰 결합