【发布时间】:2022-01-03 14:08:30
【问题描述】:
我有一个相对布局和一个 ImageView。我想根据图像加载设置可见性,比如如果图像加载成功,那么 imageview 是可见的,如果发生一些错误,则相对布局是可见的。如何使用 BindingAdapter 在数据绑定中管理这种场景?
【问题讨论】:
-
请提供足够的代码,以便其他人更好地理解或重现问题。
标签: android data-binding
我有一个相对布局和一个 ImageView。我想根据图像加载设置可见性,比如如果图像加载成功,那么 imageview 是可见的,如果发生一些错误,则相对布局是可见的。如何使用 BindingAdapter 在数据绑定中管理这种场景?
【问题讨论】:
标签: android data-binding
您的问题不清楚,所以我不知道它是否会对您有所帮助。 这些是实施的步骤
1:在BindingAdapter.kt中创建参数
@BindingAdapter("showLoading")
fun View.showLoading(loading: Boolean) {
if (loading) {
visible()
} else {
gone()
}
}
@BindingAdapter("showError")
fun View.showError(error: Boolean) {
if (error) {
visible()
} else {
gone()
}
}
fun View.gone() {
this.visibility = View.GONE
}
fun View.visible() {
this.visibility = View.VISIBLE
}
2:使用在文件 XML 中创建的参数 [app:showLoading="@{viewModel.showLoading}"] 和 [app:showError="@{viewModel.showError}"]
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="viewModel"
type="com.xxx.xxx.MainViewModel" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#EAEAE2"
android:orientation="vertical">
<Button
android:id="@+id/btnAdd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ShowLoading" />
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:showLoading="@{viewModel.showLoading}" />
<RelativeLayout
android:id="@+id/viewError"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="@color/colorPrimary"
app:showError="@{viewModel.showError}" />
</LinearLayout>
</layout>
3:在 Viewmodel 中创建 showError 和 showLoading 变量。 并将 viewModel 变量分配给绑定。
class MainViewModel: ViewModel() {
val showError: MutableLiveData<Boolean> = MutableLiveData()
val showLoading: MutableLiveData<Boolean> = MutableLiveData()
init {
showError.postValue(false)
showLoading.postValue(true)
}
}
class MainActivity : AppCompatActivity() {
private val viewModel = MainViewModel()
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.lifecycleOwner = this
binding.viewModel = viewModel
initViews()
}
private fun initViews() {
binding.btnAdd.setOnClickListener {
viewModel.showError.postValue(true)
viewModel.showLoading.postValue(false)
}
}
}
【讨论】: