아키텍처 구성요소에 레이아웃 뷰 연결

AndroidX 라이브러리에는 아키텍처 구성요소를 사용하여 강력하고 테스트와 유지관리가 쉬운 앱을 설계하는 데 사용하는 방법을 알아봅니다 데이터 결합 라이브러리는 아키텍처와 원활하게 작동합니다. 구성요소를 더욱 단순화하여 UI 개발에 도움이 됩니다 앱의 레이아웃 아키텍처 구성요소의 데이터에 결합하여 UI 컨트롤러의 수명 주기를 관리하고 데이터 변경사항을 UI에 알립니다.

이 페이지에서는 아키텍처 구성요소를 앱에 통합하여 데이터 결합 라이브러리를 최대한 활용할 수 있습니다

LiveData를 사용하여 UI에 데이터 변경 알림

LiveData 객체를 다음과 같이 사용할 수 있습니다. 데이터 결합 소스에서 데이터를 수집하는 데 사용됩니다 이 아키텍처 구성요소에 관한 자세한 내용은 LiveData 개요를 참조하세요.

객체를 구현하는 Observable: 예: Observable(관측 가능한) 필드: LiveData 객체가 데이터를 구독하는 관찰자의 수명 주기를 알고 있음 있습니다. 이러한 지식을 바탕으로 다음과 같은 많은 이점을 얻을 수 있습니다. 자세한 내용은 장점 LiveData를 사용하는 방법을 알아보세요. Android 스튜디오 버전 3.1 이상에서는 식별 가능한 필드를 대체할 수 있습니다. 데이터 결합 코드에 LiveData 객체를 사용하면 됩니다.

결합 클래스와 함께 LiveData 객체를 사용하려면 수명 주기 소유자를 사용하여 LiveData 객체의 범위를 정의해야 합니다. 다음 예는 활동을 결합 클래스 뒤의 수명 주기 소유자로 지정함 다음과 같이 인스턴스화되었습니다.

Kotlin

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.setLifecycleOwner(this)
    }
}

자바

class ViewModelActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // Inflate view and obtain an instance of the binding class.
        UserBinding binding = DataBindingUtil.setContentView(this, R.layout.user);

        // Specify the current activity as the lifecycle owner.
        binding.setLifecycleOwner(this);
    }
}

ViewModel를 사용할 수 있습니다. 구성요소를 사용하여 데이터를 레이아웃에 결합합니다. ViewModel 구성요소에서 LiveData 객체를 사용하여 데이터를 변환하거나 여러 데이터를 병합할 수 있습니다. 소스입니다 다음 예는 ViewModel의 데이터를 변환하는 방법을 보여줍니다.

Kotlin

class ScheduleViewModel : ViewModel() {
    val userName: LiveData

    init {
        val result = Repository.userName
        userName = Transformations.map(result) { result -> result.value }
    }
}

자바

class ScheduleViewModel extends ViewModel {
    LiveData username;

    public ScheduleViewModel() {
        String result = Repository.userName;
        userName = Transformations.map(result, result -> result.value);
    }
}

ViewModel을 사용하여 UI 관련 데이터 관리

데이터 결합 라이브러리는 ViewModel 구성요소. ViewModel 레이아웃에서 관찰하고 변경사항에 반응하는 데이터를 노출합니다. 사용 데이터 결합 라이브러리가 있는 ViewModel 구성요소를 사용하면 UI 로직 이동 가능 구성요소를 쉽게 테스트할 수 있습니다. 데이터 뷰가 데이터에서 결합 및 결합 해제되도록 보장하는 결합 라이브러리 사용할 수 있습니다 나머지 작업은 대부분 올바른 데이터를 노출하고 있습니다. 이 아키텍처에 대한 자세한 내용은 구성요소에 관한 자세한 내용은 ViewModel 참고 개요를 참조하세요.

데이터 결합 라이브러리와 함께 ViewModel 구성요소를 사용하려면 다음을 실행해야 합니다. 구성요소를 인스턴스화합니다. 이 구성요소는 ViewModel 클래스에서는 결합 클래스의 인스턴스를 재정의하고 ViewModel 구성요소를 속성 값을 정의합니다. 다음 예는 구성요소를 사용할 수 있습니다.

Kotlin

class ViewModelActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        // Obtain the ViewModel component.
        val userModel: UserModel by viewModels()

        // Inflate view and obtain an instance of the binding class.
        val binding: UserBinding = DataBindingUtil.setContentView(this, R.layout.user)

        // Assign the component to a property in the binding class.
        binding.viewmodel = userModel
    }
}

자바

class ViewModelActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // Obtain the ViewModel component.
        UserModel userModel = new ViewModelProvider(this).get(UserModel.class);

        // Inflate view and obtain an instance of the binding class.
        UserBinding binding = DataBindingUtil.setContentView(this, R.layout.user);

        // Assign the component to a property in the binding class.
        binding.viewmodel = userModel;
    }
}

레이아웃에서 ViewModel 구성요소의 속성과 메서드를 할당합니다. 다음과 같이 결합 표현식을 사용하여 상응하는 뷰에 추가합니다. 예:

<CheckBox
    android:id="@+id/rememberMeCheckBox"
    android:checked="@{viewmodel.rememberMe}"
    android:onCheckedChanged="@{() -> viewmodel.rememberMeChanged()}" />

결합 어댑터를 더 세밀하게 제어하기 위해 관찰 가능한 ViewModel 사용

ViewModel를 사용할 수 있습니다. 구성요소를 구현하는 Observable 인터페이스 다른 사용자에게 알리기 위해 앱 구성 요소에 대해 자세히 알아볼 수 있습니다. LiveData 객체를 반환합니다.

경우에 따라서는 특정 광고 단위를 Observable를 구현하는 ViewModel 구성요소 수명 주기가 손실되더라도 LiveData 객체 사용에 대한 인터페이스 LiveData의 관리 기능 ViewModel 구성요소 사용 구현 Observable를 사용하면 앱의 결합 어댑터를 더 세밀하게 있습니다. 예를 들어 이 패턴을 사용하면 데이터가 변경될 때 또한 커스텀 메서드를 지정하여 특성 값을 입력할 수도 있습니다.

관찰 가능한 ViewModel 구성요소를 구현하려면 다음과 같은 클래스를 만들어야 합니다. ViewModel 클래스에서 상속되고 Observable를 구현합니다. 인터페이스에 추가되었습니다. 관찰자가 구독하거나 알림 대상이 될 때 맞춤 로직을 제공할 수 있습니다. 알림을 수신 거부하려면 addOnPropertyChangedCallback() 드림 및 removeOnPropertyChangedCallback() 메서드를 참조하세요. 또한 속성이 변경될 때 실행되는 커스텀 로직을 notifyPropertyChanged() 드림 메서드를 사용하여 축소하도록 요청합니다. 다음 코드 예는 observable ViewModel:

Kotlin

/**
 * A ViewModel that is also an Observable,
 * to be used with the Data Binding Library.
 */
open class ObservableViewModel : ViewModel(), Observable {
    private val callbacks: PropertyChangeRegistry = PropertyChangeRegistry()

    override fun addOnPropertyChangedCallback(
            callback: Observable.OnPropertyChangedCallback) {
        callbacks.add(callback)
    }

    override fun removeOnPropertyChangedCallback(
            callback: Observable.OnPropertyChangedCallback) {
        callbacks.remove(callback)
    }

    /**
     * Notifies observers that all properties of this instance have changed.
     */
    fun notifyChange() {
        callbacks.notifyCallbacks(this, 0, null)
    }

    /**
     * Notifies observers that a specific property has changed. The getter for the
     * property that changes must be marked with the @Bindable annotation to
     * generate a field in the BR class to be used as the fieldId parameter.
     *
     * @param fieldId The generated BR id for the Bindable field.
     */
    fun notifyPropertyChanged(fieldId: Int) {
        callbacks.notifyCallbacks(this, fieldId, null)
    }
}

Java

/**
 * A ViewModel that is also an Observable,
 * to be used with the Data Binding Library.
 */
class ObservableViewModel extends ViewModel implements Observable {
    private PropertyChangeRegistry callbacks = new PropertyChangeRegistry();

    @Override
    protected void addOnPropertyChangedCallback(
            Observable.OnPropertyChangedCallback callback) {
        callbacks.add(callback);
    }

    @Override
    protected void removeOnPropertyChangedCallback(
            Observable.OnPropertyChangedCallback callback) {
        callbacks.remove(callback);
    }

    /**
     * Notifies observers that all properties of this instance have changed.
     */
    void notifyChange() {
        callbacks.notifyCallbacks(this, 0, null);
    }

    /**
     * Notifies observers that a specific property has changed. The getter for the
     * property that changes must be marked with the @Bindable annotation to
     * generate a field in the BR class to be used as the fieldId parameter.
     *
     * @param fieldId The generated BR id for the Bindable field.
     */
    void notifyPropertyChanged(int fieldId) {
        callbacks.notifyCallbacks(this, fieldId, null);
    }
}

추가 리소스

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