android - 为什么 DataBinding 视图可见性不起作用
问题描述
我有以下 DataBinding 设置,但只要“isPrivate”为真,可见性就会保持 View.GONE
布局.xml
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:binding="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<androidx.constraintlayout.motion.widget.MotionLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutDescription="@xml/scene_1">
...
<ImageView
android:id="@+id/iv_car_private"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:src="@drawable/ic_lock"
binding:visibility="@{viewModel.car.isPrivate}" />
...
</androidx.constraintlayout.motion.widget.MotionLayout>
<data>
<variable
name="viewModel"
type="com.app.MyViewModel" />
</data>
</layout>
活动
DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main).also { binding ->
binding.lifecycleOwner = this
binding.viewModel = myViewModel
}
绑定适配器
@BindingAdapter("visibility")
fun setVisibility(view: View, isVisible: Boolean) {
Timber.d("+++ isPrivate: $isVisible")
view.visibility = if (isVisible) View.VISIBLE else View.GONE
}
@xml/scene_1
没有引用 ImageView- 如果我删除该
binding:visibility
行,则视图可见 - BindingAdapter 中的 LogOutput 始终打印正确的真/假值
- 我也尝试
binding.invalidateAll()
在活动设置中添加,但没有区别
更新:
- 另一个 RecyclerView (它的项目)使用相同的 BindingAdapter 并且可以工作
- 如果我使用以下 BindingAdapter 伪造 invisibiliy,则正确设置了 imageResource(其余代码相同!)
@BindingAdapter("isPrivate")
fun setIsPrivate(imageView: ImageView, isPrivate: Boolean) {
if (isPrivate) {
imageView.setImageResource(R.drawable.ic_lock)
} else {
imageView.setImageDrawable(null)
}
}
解决方案
boolean
使用三元运算符可以更简单地绑定值:
android:visibility="@{car.isPrivate ? View.GONE : View.VISIBLE}"
这就是我通常在Fragment
(for fragment_main.xml
)中膨胀它们的方式:
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
this.mDataBinding = FragmentMainBinding.inflate(inflater, container, false);
if (this.mDataBinding != null) {
Car item = ...
this.mDataBinding.setCar(item);
}
}
数据绑定的真正美妙之处在于生成它,而不必编写它 - aBindingAdapter
仅用于更复杂的操作,或者默认情况下不支持某些属性。
推荐阅读
- django - 尽管使用了正确的共享访问签名值,但 Azure 服务总线消息间歇性地未经授权......为什么?
- java - Java 上的 Tensorflow:如何执行 RGB 到 BGR 的操作?
- javascript - 如何使用 javascript 变量获取完整的系列数据
- performance - 为什么在计算机图形学中使用矩阵?
- java - 如何获取函数表达式Apache POI
- python-3.x - 如何从弹出栏中选择文本
- javascript - 如何停止 JavaScript 评估
- html - 网站在移动设备上伸出窗口
- flutter - 如何解决flutter中screenshot_share_image包的偏移量(仅限ios)?
- python - 使用 python 预测 weibull 或 ecdf 的中年故障概率