관측 가능성은 객체가 다른 객체에 관해 알리는 기능을 나타냅니다. 중요한 역할을 합니다 데이터 결합 라이브러리를 사용하면 객체, 필드 또는 컬렉션을 관찰할 수 있습니다
데이터 결합에 모든 객체를 사용할 수 있지만 객체를 수정해도 UI가 자동으로 업데이트됩니다. 데이터 결합을 사용하여 객체에 대한 알림을 수신하면 다른 객체(리스너라고 함)를 도움이 될 수 있습니다 식별 가능한 클래스에는 세 가지 유형이 있습니다. 필드, 컬렉션 및 객체를 생성합니다.
식별 가능한 데이터 객체 중 하나가 UI에 바인딩되고 데이터 객체가 변경되면 UI가 자동으로 업데이트됩니다.
식별 가능한 필드
클래스에 속성이 몇 개만 있다면
인코더-디코더 아키텍처를
Observable
인터페이스 이
일반 Observable
클래스와 다음을 사용할 수 있습니다.
원시 특정 클래스를 사용하여 필드를 식별 가능하게 만듭니다.
ObservableBoolean
ObservableByte
ObservableChar
ObservableShort
ObservableInt
ObservableLong
ObservableFloat
ObservableDouble
ObservableParcelable
식별 가능한 필드는 단일 객체가 있는 독립적인 관찰 가능한 객체입니다.
필드를 확인합니다. 프리미티브 버전은 액세스 중에 박싱과 언박싱을 방지합니다.
작업을 수행할 수 있습니다 이 메커니즘을 사용하려면 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<String, Object>"/>
</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<Object>"/>
</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
인터페이스에는 리스너를 추가하고 삭제하는 메커니즘이 있지만, 개발자는
알림을 보낼 시기를 결정합니다. 데이터를 더 쉽게 개발할 수 있도록
바인딩 라이브러리는
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가 화면에 표시될 때만 트리거됩니다.
데이터 결합 지원
StateFlow
및
LiveData
자세한 내용은
데이터 결합에서 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
와(과) 원활하게 호환됩니다.
객체입니다. 다음과 같이 StateFlow
및 ViewModel
를 함께 사용할 수 있습니다.
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
블로그 게시물
추천 서비스
- 참고: JavaScript가 사용 중지되어 있으면 링크 텍스트가 표시됩니다.
- ViewModel의 저장된 상태 모듈
- 아키텍처 구성요소에 레이아웃 뷰 결합
- Paging 라이브러리 개요