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

v09wglhw  于 2023-02-14  发布在  Android
关注(0)|答案(8)|浏览(365)

我尝试使用示例项目android-sunon对视图模型进行数据绑定,当前的问题是,当我尝试构建项目时,在类DataBindinMapperImpl中得到了错误error: cannot find symbol symbol: class FragmentShopBindingImpl location: package {{packageName}}.databinding,我不确定这里遗漏了什么,因为我添加了示例项目中的所有内容,类FragmentShopBindingImpl没有生成。因为我在android sunon的例子中看不到任何以'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}}:

sz81bmfz

sz81bmfz1#

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

gg0vcinb

gg0vcinb2#

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

ix0qys7i

ix0qys7i3#

如果你有时候使用双向数据绑定(@={myBindingValue},带有**'='符号而不是@{myBindingValue}),你会遇到这个无用的一般性错误,因为你试图绑定的值在你的数据类的Kotlin中被声明为immutable =〉val而不是var**。

示例:

data class User(
   val name,
   var email
)

在此示例中,您可以将用户的email变量绑定为:text="@={myViewModel.user.email}"但是,如果您尝试绑定用户名:text="@={myViewModel.user.name}"您将收到此错误。

mpbci0fu

mpbci0fu4#

您必须在下面将变量定义为ObservableField:

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

eanckbw95#

我也出现了同样的错误,但这是因为我的android:text="@={...}"在edittext之外。

jmo0nnb3

jmo0nnb36#

我有一个BindingAdapter标记出现在一个 unreachable 模块中。

l5tcr1uw

l5tcr1uw7#

我的问题是,有多个限定符布局的例子,我有一个为夜间模式和基本文件,我只是在基本文件,而不是在其他限定符资源文件的变化,一旦我在所有限定符的变化,它为我工作。

eqqqjvef

eqqqjvef8#

我有一个类似的错误信息,但问题是不同的。虽然我看到OP的问题已经解决了,但在玩MVVM架构时,同样的错误信息可能经常弹出。(顺便说一句,我用Java给出了我的答案,但问题可以用类似的方式解决)
基本上,当这个错误消息

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

弹出时,它不会告诉您任何错误信息。当编译器由于绑定的某些问题而无法生成xxxBindingImpl类(该类应该是自动生成的)时,它会弹出。
对于我来说,通过运行./gradlew :app:build --stacktrace检查错误的实际来源帮助很大,主要是以下问题之一:

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

1.缺少导入:当您使用的类不是xml中的基元类型之一时,必须使用FULL PATH导入类,如下所示:

<data class="BoxBinding">
        <import type="android.view.View"/>  //<-----
        <variable
            name="boxData"
            type="{{packageName}}.views.boxlists.BoxList.BoxData" />
    </data>

相关问题