30

当我尝试运行我的应用程序时出现以下错误:

Error:Execution failed for task ':app:compileDevelopmentDebugJavaWithJavac'.
> java.lang.RuntimeException: Found data binding errors.
****/ data binding error ****msg:Could not find accessor java.lang.String.giftRecipientName redacted.xml loc:182:63 - 182:93 ****\ data binding error ****

我有一个 Order 对象,如下所示:

public class Order {
    public Address address;
    // unrelated fields and methods
}

嵌套的 Address 对象如下所示:

public class Address {
    public String addressLine1;
    public String addressLine2;
    public String giftRecipientName;
    public Boolean isGift;
}

在我的 .xml 中,我正在执行以下操作:

<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable name="order" type="example.redacted.models.Order"/>
    </data>
    // widgets and whatnot
    <TextView
        android:id="@+id/gift_recipientTV"
        android:layout_column="1"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:textStyle="bold"
        android:gravity="right"
        android:text='@{order.address.isGift ?  order.address.giftRecipientName : "" }'/>

最后在我的片段中:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    RedactedBinding dataBinding = DataBindingUtil.inflate(inflater, R.layout.redacted, container, false);
    dataBinding.setOrder(_order);
    return dataBinding.getRoot();
}
4

10 回答 10

35

经过数小时的反复试验,Android 数据绑定似乎在查看公共字段之前先寻找 getter。我的 Order 对象有一个名为 getAddress 的辅助方法

public class Order {
    public Address address;

    public String getAddress() {
        return address.addressLine1 + address.addressLine2;
    }
}

活页夹正在调用该方法,而不是访问公共地址字段。我将 getAddress 方法放在 Address 对象中(它可能应该从这里开始)并编译了应用程序。

于 2015-09-20T19:04:46.593 回答
8

Android 数据绑定错误。找不到访问器

  • 正如这个错误所说,绑定需要accessororgetter工作,setter如果你使用两种方式绑定
  • 所以总是把getter&setter放在你的模型课上。
于 2018-08-09T08:55:08.927 回答
3

就我而言,我正在从 xml 访问 kotlin 对象的属性:

object CurrentUser {
    // ...
    var userTeams: Map<String, String> = //...
    // ...
}
<Button
   android:text="@{CurrentUser.userTeams.get("id")}" />

但由于数据绑定使用 Java,它不能直接访问 Kotlin 对象,所以我将其更改为:

<Button
   android:text="@{CurrentUser.INSTANCE.userTeams.get("id")}" />

它有效!

于 2019-02-07T19:33:19.917 回答
3

检查您的布局文件和 ViewModel 类。两个文件中的变量名应该相同。就像:

在 ViewModel 类中:

MutableLiveData<String> emailId = new MutableLiveData<>();

在布局文件中:

<EditText
     ........
      android:text="@={loginVM.emailId}"
于 2018-11-12T09:09:46.383 回答
3

在我的情况下, MyViewModel有一个以 m 开头的变量名,它产生了一个问题

public class MyViewModel extends ViewModel {
    private LiveData<SomeClass> mTask; //Chaning the variable name to task and it's getter name to getTask worked for me
    //...code left for brevity
    public LiveData<SomeClass> getmTask() {
        return mTask;
    }
}

我将变量名称更改为mTasktask的吸气剂名称getmTaskgetTask它对我有用。

public class MyViewModel extends ViewModel {
    private LiveData<SomeClass> task;
    //...code left for brevity
    public LiveData<SomeClass> getTask() {
        return task;
    }
}

在我的 xml 文件中,我能够访问它

<TextView
    ...
    android:text="@{viewmodel.task.title}"
于 2018-10-16T23:27:09.587 回答
1

造成这种情况的原因之一可能是变量名输入错误。就我而言,我写过

android:text="@={viewModel.authPhone.Phone}"

代替

android:text="@={viewModel.authPhone.phone}"

您不必为数据类编写或覆盖 getter 和 setter。

于 2021-10-03T05:01:10.557 回答
1

请将参数值私有更改为公开,其将起作用

于 2019-10-22T08:29:38.033 回答
0

就我而言,事实是我一起使用了错误的对象。我正在使用:

      <variable
        name="searchResults"
        type=".SearchResults" />

代替:

      <variable
        name="searchResults"
        type=".SearchViewModel" />
于 2019-08-30T01:01:26.537 回答
0

遇到类似的问题并花了几个小时。我们尝试实施StateFlow而不是LiveData并且有几个Could not find accessor错误...

我们的解决方案:

  • 将 Gradle 插件从 4.2.2 升级到 7.* (JDK 1.8 -> JDK 11)
于 2021-09-07T14:04:03.647 回答
0

我的问题与@Sanjeev 相同。类实例变量以“m”(mUsername)开头。但是,问题不在于实例变量的名称。问题是吸气剂的名称。当我将吸气剂从 更改getmUserName()为 时getUserName(),它起作用了。我不明白为什么吸气剂名称中的“m”会导致问题。

于 2020-08-22T20:15:58.807 回答