web-dev-qa-db-ja.com

Android DataBindingエラー。アクセサーが見つかりませんでした

アプリを実行しようとすると、次のエラーが表示されます。

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

数時間の試行錯誤の後、Androidデータバインディングはゲッターを探しますbeforeパブリックフィールドを探します。私のOrderオブジェクトにはgetAddressというヘルパーメソッドがありました

public class Order {
    public Address address;

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

バインダーは、パブリックアドレスフィールドにアクセスする代わりに、そのメソッドを呼び出していました。私はgetAddressメソッドをAddressオブジェクト(おそらく最初からあるはずの場所)内に配置し、アプリをコンパイルしました。

26
MidasLefko

Android DataBindingエラー。アクセサーが見つかりませんでした

4
Khemraj

レイアウトファイルとViewModelクラスを確認してください。変数名は両方のファイルで同じである必要があります:

ViewModelクラス内:

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

レイアウトファイル:

<EditText
     ........
      Android:text="@={loginVM.emailId}"
3
rahul

私の場合、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")}" />

そしてそれは動作します!

2
aksh1618

私の場合、My 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;
    }
}

変数名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}"
2
Sanjeev

私の場合、間違ったオブジェクトを一緒に使用していたという事実でした。私が使用していた:

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

の代わりに:

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