gpt4 book ai didi

java - Android 数据绑定(bind)中何时计算表达式?

转载 作者:行者123 更新时间:2023-12-01 16:15:03 25 4
gpt4 key购买 nike

使用 Android 数据绑定(bind)框架,我知道您可以将一个扩展 baseObservable 的对象传递到布局 xml,在 getter 上使用 @Bindable 并执行 notificationPropertyChanged(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);
<小时/>

问题:

  1. 如果 someViewModel.name 发生更改,testView 的可见性是否会刷新?

  2. someViewModel.getName() 何时评估或多久评估一次?

  3. 如果表达式更复杂,比如:android:visibility="@{func(otherVariable, someViewModel.getName()) ? View.VISIBLE : View.GONE}",比如说 otherVariable 是 data 中定义的另一个变量上面的部分,如果 otherVariable 以某种方式被重新设置,那么 someViewModel.getName() 将被评估,并且 testView 将反射(reflect)最新的可见性值,正确吗?

  4. 跟进问题 3,如果将 otherVariable 更改为 otherVariable.a,其中 a 是“可绑定(bind)”字段,并且notifyPropertyChanged(BR.a)otherVariable 中调用,然后 someViewModel.getName() 也将被重新评估,并且 testView 将反射(reflect)最新的可见性值,对吗?

  5. 此外,如果我通过调用 binding.setSomeViewModel() 重新设置 someViewModel 但传入相同的 someViewModel 实例,它有什么作用吗?表达式会被重新计算吗?

最佳答案

我建议您为可变可见性创建自定义绑定(bind)适配器,并使用 LiveData 来更新可见性。

代码:

@BindingAdapter("mutableVisibility")
fun setMutableVisibility(view: View, visibility: MutableLiveData<Boolean>) {
val parentActivity: AppCompatActivity? = view.getParentActivity()
if (parentActivity != null) {
visibility.observe(
parentActivity,
Observer { value -> if (value) view.visibility = View.VISIBLE
else view.visibility = View.GONE})
}
}

要获取父 Activity ,请创建 ActivityExtensions.kt 文件并在其中添加以下函数:

fun View.getParentActivity(): AppCompatActivity?{
var context = this.context
while (context is ContextWrapper) {
if (context is AppCompatActivity) {
return context
}
context = context.baseContext
}
return null
}

在 ViewModel 中:

//Other code here...
val itemVisibility = MutableLiveData<Boolean>()
//Other logic here to init itemVisible
if(itemVisibile) itemVisibility.value = true else itemVisibility.value = false

最后是layoutItem:

<View
android:id="@+id/testView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:mutableVisibility ="@{viewModel.itemVisibility}" />

关于java - Android 数据绑定(bind)中何时计算表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62422852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com