【问题标题】:Adding buildFeatures { viewBinding true } results in "Cannot find a setter for <... android:visibility> that accepts parameter type 'int'添加 buildFeatures { viewBinding true } 导致“找不到接受参数类型‘int’的 <... android:visibility> 的设置器
【发布时间】:2021-01-28 04:40:55
【问题描述】:

我想在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
    }

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

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

但这似乎没有效果。

fragment_bequant_account.xmlitem_bequant_search.xml use androidx.constraintlayout.widget.ConstraintLayout instead of androidx.constraintlayout.ConstraintLayout

我尝试将@BindingAdapter 放入AccountViewModel as suggested here 但没有成功。

【问题讨论】:

  • 您的数据绑定之前是否有效,或者您也添加了该内容?
  • 数据绑定在多次提交后工作。数百个。添加标有// new line and only change的行后出现错误。
  • 数据绑定已经包含 ViewBinding。无需添加该行。 developer.android.com/topic/libraries/view-binding#data-binding
  • 在链接的文档中,我没有看到任何关于其中一个的声明,但我看到 tools:viewBindingIgnore="true" 添加到一个有问题的布局中解决了我的问题,所以感谢您让我阅读该文档!!!我很高兴,但仍然很好奇为什么这个visibility 不像其他人。

标签: android android-viewbinding


【解决方案1】:

我在我的项目中遇到了同样的问题。我在我的代码中使用了数据绑定,并且在 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" 属性的文档

【讨论】:

【解决方案2】:

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

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

每个重复使用的布局都必须有 tools:viewBindingIgnore="true" 以避免此问题

【讨论】:

    【解决方案3】:

    问题出在这句话上

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

    它评估并将View.VISIBLEView.GONE 传递给绑定适配器方法,但是

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

    正如您的方法签名所说,它需要一个布尔值,但评估结果为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
    }
    

    否则假设您在文件 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
        }
    
      }
    
    }
    

    【讨论】:

    • 我没有此属性的 BindingAdapter。您提到的代码是尝试引入一个,是的,我相应地更改了我的 xml 以设置布尔值,但这在失败尝试的列表中,我不明白为什么在这种情况下,只有在这种情况下,我突然需要一个 BindingAdapter。它应该像在所有其他情况下一样,只需在启用视图绑定之前设置标准可见性属性。
    • @Giszmo 你能详细说明你做了哪些改变但仍然没有工作
    • 如果您能告诉我您当前的代码与问题中的代码相同或有任何变化吗?
    • 正如在 cmets 上提到的,我很擅长一些小技巧,但仍然很好奇问题出在哪里。我们有一个包含数百个布局的大型代码库,其中有几十个已经在使用数据绑定。 android:visibility="@{ viewModel... ? View.VISIBLE : View.GONE}" 在项目中可以找到 39 次。只有其中一个有上述问题。
    • 你给binding.executePendingBindings()打过电话吗?为这个绑定?
    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 2011-06-08
    相关资源
    最近更新 更多