I'm getting the following error when I try to run my app:
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 ****
I have an Order object which looks like this:
public class Order {
public Address address;
// unrelated fields and methods
}
The nested Address object looks like this:
public class Address {
public String addressLine1;
public String addressLine2;
public String giftRecipientName;
public Boolean isGift;
}
In my .xml I am doing the following:
<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 : "" }'/>
Lastly in my fragment:
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();
}
After hours of trial and error it seems that Android data-binding looks for getters before it looks at public fields. My Order object had a helper method called getAddress
public class Order {
public Address address;
public String getAddress() {
return address.addressLine1 + address.addressLine2;
}
}
The binder was calling that method instead of accessing the public Address field. I put the getAddress method inside the Address object (where it probably should have been to begin with) and the app compiled.
Android DataBinding error. Could not find accessor
accessor
or getter
to work and also setter
if you use two way binding.getter
& setter
in your model class.In my case, My ViewModel
has a variable name starting with m and it was creating a problem
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;
}
}
I changed the variable name mTask
to task
and it's getter name getmTask
to getTask
and it worked for me.
public class MyViewModel extends ViewModel {
private LiveData<SomeClass> task;
//...code left for brevity
public LiveData<SomeClass> getTask() {
return task;
}
}
And In my xml file I was able to access it
<TextView
...
android:text="@{viewmodel.task.title}"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With