添加 buildFeatures { viewBinding true } 导致“找不到接受参数类型 'int' 的 setter for <... android:visibility>
Adding buildFeatures { viewBinding true } results in "Cannot find a setter for <... android:visibility> that accepts parameter type 'int'
我想在 our project 中开始使用 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
}
到在 xml 文件上方膨胀的 AccountFragment,将 xml 更改为
android:visibility="@{viewModel.searchMode}"
但这似乎没有效果。
fragment_bequant_account.xml
和 item_bequant_search.xml
。
我尝试将 @BindingAdapter
放入 AccountViewModel
但没有成功。
这个语句有问题
app:visibility="@{viewModel.searchMode ? View.VISIBLE : View.GONE}"
它评估并将View.VISIBLE
或View.GONE
传递给绑定适配器方法,但是
@BindingAdapter("visibility")
fun setVisibility(target: View, visible: Boolean)
正如您的方法签名所说,它需要一个布尔值,但评估结果为 int
,即 View.VISIBLE
或 View.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
}
否则假设您在文件 BindingAdapters.kt
中有一个 class 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
}
}
}
我在我的项目中遇到了同样的问题。我在我的代码中使用了数据绑定,并且在 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 试图在包含中创建布局的绑定 class。
似乎为主布局(dataBinding)创建的绑定 class 在 viewBinding = true 时以不同的方式管理包含的布局并且不理解它是 attrs
正如 James 所说 tools:viewBindingIgnore="true" 是解决方案,在这种情况下它必须在包含的布局中( layout="@layout/item_bequant_search").
每个重复使用的布局都必须有 tools:viewBindingIgnore="true" 以避免这个问题
我想在 our project 中开始使用 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
}
到在 xml 文件上方膨胀的 AccountFragment,将 xml 更改为
android:visibility="@{viewModel.searchMode}"
但这似乎没有效果。
fragment_bequant_account.xml
和 item_bequant_search.xml
我尝试将 @BindingAdapter
放入 AccountViewModel
这个语句有问题
app:visibility="@{viewModel.searchMode ? View.VISIBLE : View.GONE}"
它评估并将View.VISIBLE
或View.GONE
传递给绑定适配器方法,但是
@BindingAdapter("visibility")
fun setVisibility(target: View, visible: Boolean)
正如您的方法签名所说,它需要一个布尔值,但评估结果为 int
,即 View.VISIBLE
或 View.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
}
否则假设您在文件 BindingAdapters.kt
中有一个 classBindingAdapters
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
}
}
}
我在我的项目中遇到了同样的问题。我在我的代码中使用了数据绑定,并且在 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 试图在包含中创建布局的绑定 class。 似乎为主布局(dataBinding)创建的绑定 class 在 viewBinding = true 时以不同的方式管理包含的布局并且不理解它是 attrs
正如 James 所说 tools:viewBindingIgnore="true" 是解决方案,在这种情况下它必须在包含的布局中( layout="@layout/item_bequant_search").
每个重复使用的布局都必须有 tools:viewBindingIgnore="true" 以避免这个问题