Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么数据绑定视图可见性不起作用_Android_Visibility_Android Databinding_Android Architecture Components - Fatal编程技术网

Android 为什么数据绑定视图可见性不起作用

Android 为什么数据绑定视图可见性不起作用,android,visibility,android-databinding,android-architecture-components,Android,Visibility,Android Databinding,Android Architecture Components,我有以下数据绑定设置,但只要“isPrivate”为真,可见性就会保持View.GONE layout.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" xmln

我有以下数据绑定设置,但只要“isPrivate”为真,可见性就会保持View.GONE

layout.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>
  • @xml/scene_1
    未引用ImageView
  • 如果删除
    绑定:可见性
    行,则视图可见
  • BindingAdapter中的LogOutput始终打印正确的真/假值
  • 我还尝试在活动设置中添加
    binding.invalidateAll()
    ,但没有区别
更新:

  • 同一个BindingAdapter由另一个RecyclerView(其项)使用并工作
  • 如果我使用以下BindingAdapter伪造不可见性,则imageResource设置正确(其余代码相同!)

使用三元运算符可以更简单地绑定
布尔值

android:visibility="@{car.isPrivate ? View.GONE : View.VISIBLE}"
这就是我通常在
片段
(对于
Fragment\u main.xml
)中充气的方式:


数据绑定的实际好处是生成数据,而不是编写数据-只有更复杂的操作需要
BindingAdapter
,或者默认情况下不支持某些属性。

rootview和活动中的绑定是不同的吗?我认为应该使用绑定而不是rootView。DataBindingUtil.setContentView()将返回ActivityMainBinding.ah抱歉,这是一个输入错误。实际上我不需要rootView。我编辑了这个问题。更改变量赋值的顺序,首先将viewmodel赋值给绑定变量(
binding.viewmodel=myViewModel
),然后设置
binding.lifecycleOwner=this
。我还尝试了内联逻辑。没什么区别。我稍微简化了代码,并选择“object”作为viewModel中数据绑定字段的单词。我将其更改为“car”@muetzenflo您可能必须在
中导入
视图
,否则它可能无法生成绑定。这里有一个,我确信它是有效的
DataBindingUtil.setContentView()
可能是另一个可能的原因,因为我通常使用它进行充气(不需要XML文件名)。不需要导入
View
,因为我不使用内联XML逻辑。可见性是在BindingAdapter中设置的,BindingAdapter无论如何都知道
View
。否则,我将如何在活动中充气?据我所知,您只能在片段中使用
inflate()
方法。另外,别忘了这个布局中的所有其他绑定都工作得很好…这是故事中最奇怪的部分…@muetzenflo然后继续你想要完成的事情。。。我已经详细解释过了,而我并不是一个无知的朋友。它是如此简单,除非添加所有无用的复杂性并抱怨它不起作用。不要误解我的意思。我很感谢你的意见,但我已经尝试了所有这些,但都没有成功。我尝试将if-else放在xml中并导入
视图
。没有成功。我尝试使用另一种方法来扩展ViewDataBinding,但在活动中不可能。为什么我无知。。。?
@BindingAdapter("visibility")
fun setVisibility(view: View, isVisible: Boolean) {
    Timber.d("+++ isPrivate: $isVisible")
    view.visibility = if (isVisible) View.VISIBLE else View.GONE
}
    @BindingAdapter("isPrivate")
    fun setIsPrivate(imageView: ImageView, isPrivate: Boolean) {
        if (isPrivate) {
            imageView.setImageResource(R.drawable.ic_lock)
        } else {
            imageView.setImageDrawable(null)
        }
    }
android:visibility="@{car.isPrivate ? View.GONE : View.VISIBLE}"
@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);
    }
}