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

Android DataBinding error. Could not find accessor

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

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 ****

我有一个如下所示的订单对象:

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

嵌套的地址对象如下所示:

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();
}

经过数小时的反复试验,Android 数据绑定似乎在 之前 查找 getter,它查找 public 字段。我的订单对象有一个名为 getAddress

的辅助方法
public class Order {
    public Address address;

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

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

Android DataBinding error. Could not find accessor

  • 如该错误所示,绑定需要 accessorgetter 才能工作,如果您使用 ,还需要 setter .
  • 所以总是把 getter & setter 放在你的模型中 class.

在我的例子中,我的 ViewModel 有一个以 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;
    }
}

我将变量名称 mTask 更改为 task 并且它的 getter 名称 getmTask 更改为 getTask 并且对我有用。

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}"

检查您的布局文件和 ViewModel class。两个 files.just 中的变量名称应该相同,例如:

在 ViewModel 中 class:

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

在布局文件中:

<EditText
     ........
      android:text="@={loginVM.emailId}"

在我的例子中,我从 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")}" />

而且有效!

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

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

而不是:

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

请将私有参数值更改为 public 它会起作用

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

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

我们的解决方案:

  • 将 Gradle 插件从 4.2.2 升级到 7.* (JDK 1.8 -> JDK 11)

其中一个原因可能只是输入错误的变量名称。 就我而言,我写了

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

而不是

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

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