Android 数据绑定:在生成的数据绑定文件中找不到...BindingImpl。

11

我试图使用示例项目android-sunflower绑定一个viewmodel,但目前的问题是在尝试构建该项目时,我会遇到错误 error: cannot find symbol symbol: class FragmentShopBindingImpl location: package {{packageName}}.databinding 在类 DataBindinMapperImpl 中。我不太确定我错过了什么,因为我已经添加了示例项目中的所有内容。类FragmentShopBindingImpl没有被生成,或者它不应该被生成吗?由于我在android sunflower示例中看不到任何以'Impl'结尾的类。

override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        val factory = InjectorUtils.provideShopViewModelFactory(context!!)
        val shopViewModel = ViewModelProviders.of(this, factory)
            .get(ShopViewModel::class.java)

        val binding = DataBindingUtil.inflate<FragmentShopBinding>(
            inflater, R.layout.fragment_shop, container, false).apply {
            viewModel = shopViewModel
            lifecycleOwner = this@ShopFragment
        }

        return binding.root
    }

布局:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="viewModel"
            type="{{packageName}}.viewmodel.ShopViewModel" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".fragments.ShopFragment">

        <TextView
            android:text="@{viewModel}"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </LinearLayout>
</layout>

生成文件的图像(忽略{{packageName}}):

enter image description here


如果我有时间,我会检查它。 - BrianM
8个回答

10

看起来我需要添加的唯一一件事是在数据标签中添加<import type="android.view.View" />...


8
在textView标签中的xml代码中,您使用了@{viewmodel}作为android:text属性。它只是引用了您的shopViewModel类,您必须针对该类内的text变量。然后gen.类文件错误将消失。
bindingImpl错误通常是由于XML-text或XML-onClick属性的无效赋值而生成的。

4
如果您使用双向数据绑定(@={myBindingValue},而不是@{myBindingValue})时,有时会出现无用的通用错误,因为您尝试绑定的值在Kotlin中声明为不可变的val,而不是var,在您的数据类中。
示例:
data class User(
   val name,
   var email
)

在这个例子中,你可以将用户的电子邮件变量绑定为:text="@={myViewModel.user.email}" 但是,如果你尝试绑定用户的姓名:text="@={myViewModel.user.name}" 你会收到此错误。

0
对我来说问题在于,有多个限定符布局,例如我有一个用于夜间模式和基础文件的布局,我只在基础文件中进行更改而不在其他限定符资源文件中进行更改,一旦我在所有限定符中进行了更改,它就可以正常工作。

0

我有一个BindingAdapter标签,它存在于一个无法访问的模块中。


0

我遇到了相同的错误,但是这是因为我的android:text="@={...}"在editText之外。


0

在以下代码中,您必须将变量定义为ObservableField:

 public final ObservableField<String> name = new ObservableField<>();
 public final ObservableField<String> family = new ObservableField<>();

0

我曾经遇到过类似的错误信息,但问题不同。虽然我看到 OP 的问题已经解决了,但在使用 MVVM 架构时,可能会经常出现相同的错误信息。(顺便说一下,我用 Java 给出我的答案,但问题可以以类似的方式解决)

基本上,当出现这个错误信息时

error: cannot find symbol symbol:   class FragmentShopBindingImpl
  location: package {{packageName}}.databinding

弹出窗口并没有告诉你哪里出了问题。它会在编译器无法生成xxxBindingImpl类(应该是自动生成的)时弹出,这是由于绑定存在某些问题。

对于我的情况,通过运行./gradlew :app:build --stacktrace来检查实际错误源代码非常有帮助,而且大多数情况下都是以下问题之一:

  1. xml中名称冲突(特别是当您有多个需要相同绑定类的id的视图时)
  2. 某些属性没有默认的绑定适配器,例如android:layout_widthandroid:src。在这种情况下,您需要通过添加@BindingAdapter标签来设置属性的绑定适配器:
    @BindingAdapter("android:src") //<-----
    public static void setIcon(ImageView view, int drawable){ view.setImageResource(drawable); }

缺少导入: 当您使用不是xml中原始类型之一的类时,您必须按照以下方式使用完整路径导入该类:
    <data class="BoxBinding">
        <import type="android.view.View"/>  //<-----
        <variable
            name="boxData"
            type="{{packageName}}.views.boxlists.BoxList.BoxData" />
    </data>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接