[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.ktclass 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에 대한 큰 요구 사항은 없습니까?
Reference
이 문제에 관하여([Android] ViewModel+LiveData+DataBinding+CustomView를 통한 변경 공지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/morayl/items/c877e6bd60c375cff655
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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.ktclass 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에 대한 큰 요구 사항은 없습니까?
Reference
이 문제에 관하여([Android] ViewModel+LiveData+DataBinding+CustomView를 통한 변경 공지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/morayl/items/c877e6bd60c375cff655
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
class CustomView(context: Context, attrs: AttributeSet? = null) : ConstraintLayout(context, attrs) {
val binding = ViewCustomBinding.inflate(LayoutInflater.from(context), this, true).apply{
lifecycleOwner = context as? LifecycleOwner
}
}
/**
* 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에 대한 큰 요구 사항은 없습니까?
Reference
이 문제에 관하여([Android] ViewModel+LiveData+DataBinding+CustomView를 통한 변경 공지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/morayl/items/c877e6bd60c375cff655텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)