양방향 데이터 결합

단방향 데이터 결합을 사용하면 속성에 값을 설정하고 리스너입니다.

<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라는 맞춤 뷰에서 다음 단계를 완료합니다.

  1. 초깃값을 설정하고 값이 변경될 때 업데이트하는 메서드에 주석을 추가합니다. @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;
        }
    }
  2. 뷰에서 값을 읽는 메서드에 다음을 사용하여 주석을 추가합니다. @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

블로그 게시물