添加 buildFeatures { viewBinding true } 会导致“无法找到接受参数类型 'int' 的 <... android:visibility> 的 setter

Gis*_*zmo 6 android android-viewbinding

我想开始viewBinding我们的项目中使用,但仅仅添加配置就会导致编译错误:

android {
    buildFeatures {
        dataBinding true
        viewBinding true // new line and only change
    }
Run Code Online (Sandbox Code Playgroud)

结果是:

e: /home/leo/StudioProjects/android-wallet/mbw/build/generated/source/kapt/btctestnetDebug/com/mycelium/wallet/DataBinderMapperImpl.java:37: error: cannot find symbol
import com.mycelium.wallet.databinding.FragmentBequantAccountBindingImpl;
                                      ^
  symbol:   class FragmentBequantAccountBindingImpl
  location: package com.mycelium.wallet.databinding




Cannot find a setter for <com.mycelium.wallet.databinding.ItemBequantSearchBinding app:visibility> that accepts parameter type 'int'

If a binding adapter provides the setter, check that the adapter is annotated correctly and that the parameter type matches.
Run Code Online (Sandbox Code Playgroud)

有问题的代码是:

    <data>

        <import type="android.view.View" />

        <variable
            name="viewModel"
            type="com.mycelium.bequant.market.viewmodel.AccountViewModel" />
    </data>
...
<include
    android:id="@+id/searchBar"
    layout="@layout/item_bequant_search"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:visibility="@{viewModel.searchMode ? View.VISIBLE : View.GONE}" removing="this line fixes compilation"
    app:layout_constraintTop_toBottomOf="@id/hideZeroBalance" />
Run Code Online (Sandbox Code Playgroud)

将有问题的行更改为任何

android:visibility="@{viewModel.searchMode ? `visible` : `gone`}"
app:visibility="@{viewModel.searchMode ? View.VISIBLE : View.GONE}"
Run Code Online (Sandbox Code Playgroud)

导致类似的错误。

我读到我可能必须定义 aBindingAdapter但为什么以及在哪里?

我尝试添加


    @BindingAdapter("visibility")
    fun setVisibility(target: View, visible: Boolean) {
        target.visibility = if (visible) View.VISIBLE else View.GONE
    }
Run Code Online (Sandbox Code Playgroud)

到 AccountFragment ,它会膨胀上面的 xml 文件,将 xml 更改为

android:visibility="@{viewModel.searchMode}"
Run Code Online (Sandbox Code Playgroud)

但这似乎没有效果。

两者都使用fragment_bequant_account.xml代替.item_bequant_search.xml androidx.constraintlayout.widget.ConstraintLayoutandroidx.constraintlayout.ConstraintLayout

我尝试按照此处的建议@BindingAdapter将 a 放入其中,但没有成功。AccountViewModel

ole*_*234 4

我在我的项目中遇到了同样的问题。我在代码中使用了数据绑定,并dataBinding true在 gradle 中使用了数据绑定。一旦我添加,viewBinding true我就得到了指向 xml 行的相同错误android:visibility="@{viewModel.searchMode ? View.VISIBLE : View.GONE}"

为了修复这个问题,我将该tools:viewBindingIgnore="true"属性添加到某个布局文件的根视图中,以便在生成绑定类时忽略布局。

您可以tools:viewBindingIgnore="true"https://developer.android.com/topic/libraries/view-binding#data-binding上查看有关该属性的文档