通过Android数据绑定框架,我了解到您可以传递将baseObservable
扩展到布局xml的对象,在getter上使用@Bindable
并执行notifyPropertyChanged(BR.xxx)
来重新评估相关部分。
我不明白的是:如果您不使用上面的大部分内容,而只是直接在xml中调用getter,那么何时对其进行评估?
这是代码:
my_widget.xml
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="someViewModel"
type="com.example.SomeViewModel" />
</data>
<androidx.cardview.widget.CardView>
<View
android:id="@+id/testView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="@{someViewModel.getName() ? View.VISIBLE : View.GONE}" />
</androidx.cardview.widget.CardView>
</layout>
MyView.java
MyWidgetBinding binding = MyWidgetBinding.inflate(LayoutInflater.from(mContext), parent, false);
binding.setSomeViewModel(someViewModel);
问题:
如果
someViewModel.name
曾经更改过,testView
的可见性是否会刷新?someViewModel.getName()
什么时候得到评估或多久评估一次?如果表达式更复杂,则类似于:
android:visibility="@{func(otherVariable, someViewModel.getName()) ? View.VISIBLE : View.GONE}"
,例如otherVariable
是上面数据部分中定义的另一个变量,如果以某种方式重新设置otherVariable
,则someViewModel.getName()
将得到求值,而testView
将反映最新的可见性值,对吗?跟进问题3,如果
otherVariable
更改为otherVariable.a
,其中a
是“可绑定”字段,并且在notifyPropertyChanged(BR.a)
中调用otherVariable
,则someViewModel.getName()
也将得到重新评估,而testView
会反映出最新的可见度值,对吗?另外,如果我通过调用
someViewModel
来重新设置binding.setSomeViewModel()
,但传入了SAME someViewModel
实例,它会执行任何操作吗?表达式会重新评估吗? 最佳答案
如果someViewModel.name曾经更改过,testView的可见性是否会改变
刷新?
这取决于您使用的基础技术。 LiveData?是BaseObservable,您必须手动通知观察到的属性已更改。
何时对someViewModel.getName()进行评估,或多久评估一次?
LiveData?设置/发布值时。通知时为BaseObservable
与第2点相同
如果您更改基础值并正确通知此更改,它将进行相应的传播。如果更改观察对象的实例,则不会。