관찰 가능한 데이터 객체로 작업

관측 가능성은 객체가 다른 객체에 관해 알리는 기능을 나타냅니다. 중요한 역할을 합니다 데이터 결합 라이브러리를 사용하면 객체, 필드 또는 컬렉션을 관찰할 수 있습니다

데이터 결합에 모든 객체를 사용할 수 있지만 객체를 수정해도 UI가 자동으로 업데이트됩니다. 데이터 결합을 사용하여 객체에 대한 알림을 수신하면 다른 객체(리스너라고 함)를 도움이 될 수 있습니다 식별 가능한 클래스에는 세 가지 유형이 있습니다. 필드, 컬렉션객체를 생성합니다.

식별 가능한 데이터 객체 중 하나가 UI에 바인딩되고 데이터 객체가 변경되면 UI가 자동으로 업데이트됩니다.

식별 가능한 필드

클래스에 속성이 몇 개만 있다면 인코더-디코더 아키텍처를 Observable 인터페이스 이 일반 Observable 클래스와 다음을 사용할 수 있습니다. 원시 특정 클래스를 사용하여 필드를 식별 가능하게 만듭니다.

식별 가능한 필드는 단일 객체가 있는 독립적인 관찰 가능한 객체입니다. 필드를 확인합니다. 프리미티브 버전은 액세스 중에 박싱과 언박싱을 방지합니다. 작업을 수행할 수 있습니다 이 메커니즘을 사용하려면 Java에서 public final 속성을 만듭니다. 읽기 전용 속성을 사용해야 합니다. 다음 예를 참고하세요.

Kotlin

class User {
    val firstName = ObservableField<String>()
    val lastName = ObservableField<String>()
    val age = ObservableInt()
}

자바

private static class User {
    public final ObservableField<String> firstName = new ObservableField<>();
    public final ObservableField<String> lastName = new ObservableField<>();
    public final ObservableInt age = new ObservableInt();
}

필드 값에 액세스하려면 set()get() 접근자 메서드 또는 Kotlin 속성 사용 구문:

Kotlin

user.firstName = "Google"
val age = user.age

자바

user.firstName.set("Google");
int age = user.age.get();

식별 가능한 컬렉션

일부 앱은 동적 구조를 사용하여 데이터를 보유합니다. 관찰 가능한 컬렉션을 사용하면 키를 사용하여 이러한 구조에 액세스할 수 있습니다. 이 ObservableArrayMap 클래스 은 키가 String과 같은 참조 유형일 때 유용합니다. 다음 예를 참고하세요.

Kotlin

ObservableArrayMap<String, Any>().apply {
    put("firstName", "Google")
    put("lastName", "Inc.")
    put("age", 17)
}

자바

ObservableArrayMap<String, Object> user = new ObservableArrayMap<>();
user.put("firstName", "Google");
user.put("lastName", "Inc.");
user.put("age", 17);

다음 예와 같이 레이아웃에서 문자열 키를 사용하여 지도를 찾을 수 있습니다. 다음 예를 참고하세요.

<data>
    <import type="android.databinding.ObservableMap"/>
    <variable name="user" type="ObservableMap&lt;String, Object&gt;"/>
</data>
…
<TextView
    android:text="@{user.lastName}"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
<TextView
    android:text="@{String.valueOf(1 + (Integer)user.age)}"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

ObservableArrayList 클래스는 다음과 같이 키가 정수일 때 유용합니다.

Kotlin

ObservableArrayList<Any>().apply {
    add("Google")
    add("Inc.")
    add(17)
}

자바

ObservableArrayList<Object> user = new ObservableArrayList<>();
user.add("Google");
user.add("Inc.");
user.add(17);

다음 예와 같이 레이아웃에서 색인을 통해 목록에 액세스할 수 있습니다. 다음 예를 참고하세요.

<data>
    <import type="android.databinding.ObservableList"/>
    <import type="com.example.my.app.Fields"/>
    <variable name="user" type="ObservableList&lt;Object&gt;"/>
</data>
…
<TextView
    android:text='@{user[Fields.LAST_NAME]}'
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
<TextView
    android:text='@{String.valueOf(1 + (Integer)user[Fields.AGE])}'
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

식별 가능한 객체

Observable 인터페이스를 구현하는 클래스는 observable의 속성 변경 알림을 받으려는 리스너 객체를 지정합니다.

Observable 인터페이스에는 리스너를 추가하고 삭제하는 메커니즘이 있지만, 개발자는 알림을 보낼 시기를 결정합니다. 더 쉽게 개발할 수 있도록 Data 바인딩 라이브러리는 BaseObservable 클래스 리스너 등록 메커니즘을 구현합니다. 인코더-디코더 아키텍처를 BaseObservable는 속성이 변경될 때 알리는 역할을 합니다. 해야 할 일 이 경우 Bindable 주석을 를 getter에 연결하고 notifyPropertyChanged() 메서드를 호출합니다.

Kotlin

class User : BaseObservable() {

    @get:Bindable
    var firstName: String = ""
        set(value) {
            field = value
            notifyPropertyChanged(BR.firstName)
        }

    @get:Bindable
    var lastName: String = ""
        set(value) {
            field = value
            notifyPropertyChanged(BR.lastName)
        }
}

자바

private static class User extends BaseObservable {
    private String firstName;
    private String lastName;

    @Bindable
    public String getFirstName() {
        return this.firstName;
    }

    @Bindable
    public String getLastName() {
        return this.lastName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
        notifyPropertyChanged(BR.firstName);
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
        notifyPropertyChanged(BR.lastName);
    }
}

데이터 결합은 모듈 패키지에 BR라는 클래스를 생성하며, 이 클래스에는 데이터 결합에 사용된 리소스의 ID입니다. Bindable 주석 컴파일 중에 BR 클래스 파일에 항목을 생성합니다. 기본 클래스가 변경할 수 없는 경우 Observable 인터페이스를 구현할 수 있습니다. 다음을 사용하여 PropertyChangeRegistry 객체를 사용하여 효율적으로 등록하고 리스너에 알립니다.

수명 주기 인식 객체

앱의 레이아웃은 자동으로 생성되는 데이터 결합 소스에도 결합될 수 있습니다. 데이터 변경사항을 UI에 알립니다. 이렇게 하면 수명 주기를 인식하며 UI가 화면에 표시될 때만 트리거됩니다.

데이터 결합 지원 StateFlowLiveData 자세한 내용은 데이터 결합에서 LiveData 사용에 관한 자세한 내용은 LiveData를 사용하여 UI에 데이터 알리기 변경사항을 포함합니다.

StateFlow 사용

앱이 코루틴과 함께 Kotlin을 사용하는 경우 다음을 사용할 수 있습니다. StateFlow 객체를 데이터 결합 소스로 사용하면 됩니다. 다음과 함께 StateFlow 객체를 사용하려면 다음 안내를 따르세요. 수명 주기 소유자를 지정하여 StateFlow 객체. 다음 예는 활동을 수명 주기 소유자에 대한 호출을 보여줍니다.

class ViewModelActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        // Inflate view and obtain an instance of the binding class.
        val binding: UserBinding = DataBindingUtil.setContentView(this, R.layout.user)

        // Specify the current activity as the lifecycle owner.
        binding.lifecycleOwner = this
    }
}

아키텍처에 레이아웃 뷰 결합 구성요소, 데이터 결합 ViewModel와(과) 원활하게 호환됩니다. 객체입니다. 다음과 같이 StateFlowViewModel를 함께 사용할 수 있습니다.

class ScheduleViewModel : ViewModel() {

    private val _username = MutableStateFlow<String>("")
    val username: StateFlow<String> = _username

    init {
        viewModelScope.launch {
            _username.value = Repository.loadUserName()
        }
    }
}

레이아웃에서 ViewModel 객체의 속성과 메서드를 다음과 같이 결합 표현식을 사용하여 상응하는 뷰 예:

<TextView
    android:id="@+id/name"
    android:text="@{viewmodel.username}" />

사용자의 이름 값이 변경될 때마다 UI가 자동으로 업데이트됩니다.

StateFlow 지원 사용 중지

Kotlin과 AndroidX를 사용하는 앱에서는 StateFlow가 자동으로 지원됩니다. API에 액세스할 수 있습니다. 즉, 코루틴 종속 항목은 자동으로 포함됩니다(아직 종속 항목을 사용할 수 없는 경우).

다음을 추가하여 이 기능을 선택 해제할 수 있습니다. build.gradle 파일:

Groovy

android {
    ...
    dataBinding {
        addKtx = false
    }
}

Kotlin

android {
    ...
    dataBinding {
        addKtx = false
    }
}

또는 다음을 추가하여 프로젝트에서 전역적으로 StateFlow를 사용 중지할 수 있습니다. gradle.properties 파일에 다음 줄을 추가합니다.

Groovy

android.defaults.databinding.addKtx = false

Kotlin

android.defaults.databinding.addKtx = false

추가 리소스

데이터 결합에 관한 자세한 내용은 다음 추가 리소스를 참고하세요.

샘플

Codelab

블로그 게시물