[Android] ViewModel+LiveData+DataBinding+CustomView를 통한 변경 공지

입문


지금까지 Databinding의 View Model은 Observable Field를 사용해 왔지만 Live Data+를 사용해 갑자기 Custom View에 도전하면 알림 변경이 없어 빠져들기 때문에 대처법을 적어야 한다.

Databinding × LiveData


ViewModel에서 ObservableField만 사용하는 것과 달리 LiveData를 사용할 때 binding에 setLifecyclewner를 해야 합니다.
To use a LiveData object with your binding class, you need to specify a lifecycle owner to define the scope of the LiveData object.
https://developer.android.com/topic/libraries/data-binding/architecture

CustomView x Databinding x LiveData


단, Databinding CustomView를 이용한 View Model에서 Live Data를 사용하고 싶은 경우 이 CustomView를 이용한 Activity/Fragment에서 binding을 사용합니다.setLifecycleOwner에서 변경 사항을 공지하지 않았습니다.
CustomView에서도 set Lifecycle Owner가 필요할 것 같습니다.
CustomView.kt
class CustomView(context: Context, attrs: AttributeSet? = null) : ConstraintLayout(context, attrs) {
    val binding = ViewCustomBinding.inflate(LayoutInflater.from(context), this, true).apply{
        lifecycleOwner = context as? LifecycleOwner
    }
}
이렇게 하면 활동이나 Fragment에서 사용하는 보기가 Lifecycle Owner와 연결됩니다.
참고로 set Lifecycle Owner의 매개 변수는 비어 있기 때문에 as?문제 없어요.
만약 context가 Lifecycle Owner를 실현하지 않았다면 아무 일도 일어나지 않았을 것이다.
(참조) ViewDatabinding.setLifecycleOwner
    /**
     * Sets the {@link LifecycleOwner} that should be used for observing changes of
     * LiveData in this binding. If a {@link LiveData} is in one of the binding expressions
     * and no LifecycleOwner is set, the LiveData will not be observed and updates to it
     * will not be propagated to the UI.
     *
     * @param lifecycleOwner The LifecycleOwner that should be used for observing changes of
     *                       LiveData in this binding.
     */
    @MainThread
    public void setLifecycleOwner(@Nullable LifecycleOwner lifecycleOwner) {
        if (mLifecycleOwner == lifecycleOwner) {
            return;
        }
        if (mLifecycleOwner != null) {
            mLifecycleOwner.getLifecycle().removeObserver(mOnStartListener);
        }
        mLifecycleOwner = lifecycleOwner;
        if (lifecycleOwner != null) {
            if (mOnStartListener == null) {
                mOnStartListener = new OnStartListener();
            }
            lifecycleOwner.getLifecycle().addObserver(mOnStartListener);
        }
        for (WeakListener<?> weakListener : mLocalFieldObservers) {
            if (weakListener != null) {
                weakListener.setLifecycleOwner(lifecycleOwner);
            }
        }
    }

마지막


CustomView에서 Databinding에 대한 큰 요구 사항은 없습니까?

좋은 웹페이지 즐겨찾기