添加 buildFeatures { viewBinding true } 会导致"找不到<...android:visibility>的二传手,该设置器接受参数类型'int'



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

android {
buildFeatures {
dataBinding true
viewBinding true // new line and only change
}

结果:

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.

违规代码是:

<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" />

将违规行更改为

中的任意一行
android:visibility="@{viewModel.searchMode ? `visible` : `gone`}"
app:visibility="@{viewModel.searchMode ? View.VISIBLE : View.GONE}"

也会产生类似的错误。

我读到我可能要定义一个BindingAdapter,但为什么和在哪里?

我试着添加


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

到AccountFragment,它将扩展到xml文件之上,将xml更改为

android:visibility="@{viewModel.searchMode}"

但这似乎没有效果。

fragment_bequant_account.xmlitem_bequant_search.xml都使用androidx.constraintlayout.widget.ConstraintLayout而不是androidx.constraintlayout.ConstraintLayout

我尝试将@BindingAdapter放入AccountViewModel中,但没有成功。

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

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

您可以在https://developer.android.com/topic/libraries/view-binding#data-binding

查看tools:viewBindingIgnore="true"属性的文档

问题在于viewBinding试图在include中创建布局的绑定类。似乎为主布局(dataBinding)创建的绑定类以不同的方式管理包含的布局,当viewBinding = true,不理解它的属性

正如James所说tools:viewBindingIgnore="true">是解决方案,在这种情况下,它必须在包含的布局(layout="@layout/item_bequant_search")。

每个重用的布局必须有工具:viewBindingIgnore="true">避免这个问题

我得到了类似的错误,这是我的解决方案:你只需要添加标签''来包含如下布局:在主布局中:

<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>
<import type="android.view.View" />
<variable
name="viewId"
type="Integer" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/bg">
<include
android:id="@+id/img_no_data"
layout="@layout/layout_no_data"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:visibility="@{viewId==0? View.VISIBLE: View.GONE}"
app:layout_constraintBottom_toTopOf="@+id/btn_camera"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

在include layout中:添加标签'<layout…"太:>

<layout>
<androidx.constraintlayout.widget.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/imageView2"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="@dimen/_16sdp"
android:layout_marginEnd="@dimen/_16sdp"
android:src="@drawable/bg_no_data"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="986:817"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

完成了!希望对你有帮助。

问题在于这个语句

app:visibility="@{viewModel.searchMode ? View.VISIBLE : View.GONE}"

计算并传递View.VISIBLEView.GONE给绑定适配器方法,但是

@BindingAdapter("visibility")
fun setVisibility(target: View, visible: Boolean)

正如你的方法签名所说,它期望一个bolen,但计算结果在int,即View.VISIBLEView.GONE

这个问题可以通过移除求值并直接传递布尔值来解决。

app:visibility="@{viewModel.searchMode}"

我假设viewModel.searchMode是一个布尔变量

允许您创建一个名为BindingAdapters.kt的kotlin文件

将此方法直接粘贴到此处

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

else假设你在bindingadapters。kt文件中有一个类BindingAdapters

class BindingAdapters{

companion object{

@BindingAdapter("visibility")
@JvmStatic// it is important
fun setVisibility(target: View, visible: Boolean) {
target.visibility = if (visible) View.VISIBLE else View.GONE
}
}
}

相关内容

最新更新