アプリを実行しようとすると、次のエラーが表示されます。
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();
}
数時間の試行錯誤の後、Androidデータバインディングはゲッターを探しますbeforeパブリックフィールドを探します。私のOrderオブジェクトにはgetAddressというヘルパーメソッドがありました
public class Order {
public Address address;
public String getAddress() {
return address.addressLine1 + address.addressLine2;
}
}
バインダーは、パブリックアドレスフィールドにアクセスする代わりに、そのメソッドを呼び出していました。私はgetAddressメソッドをAddressオブジェクト(おそらく最初からあるはずの場所)内に配置し、アプリをコンパイルしました。
Android DataBindingエラー。アクセサーが見つかりませんでした
accessor
またはgetter
が必要です。また、twoを使用する場合はsetter
も必要です方法バインディング。getter
とsetter
を入れてください。レイアウトファイルとViewModelクラスを確認してください。変数名は両方のファイルで同じである必要があります:
ViewModelクラス内:
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")}" />
そしてそれは動作します!
私の場合、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;
}
}
変数名mTask
をtask
に変更し、ゲッター名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}"
私の場合、間違ったオブジェクトを一緒に使用していたという事実でした。私が使用していた:
<variable
name="searchResults"
type=".SearchResults" />
の代わりに:
<variable
name="searchResults"
type=".SearchViewModel" />