Android DataBinding error. Could not find accessor
Solution 1
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.
Solution 2
Android DataBinding error. Could not find accessor
- As this error tells, binding needs
accessor
orgetter
to work and alsosetter
if you use two way binding. - So always put
getter
&setter
in your model class.
Solution 3
In my case, I was accessing a kotlin object's property from xml:
object CurrentUser {
// ...
var userTeams: Map<String, String> = //...
// ...
}
<Button
android:text="@{CurrentUser.userTeams.get("id")}" />
but as data binding uses Java, it can't access a Kotlin object directly, so I changed it to:
<Button
android:text="@{CurrentUser.INSTANCE.userTeams.get("id")}" />
And it works!
Solution 4
Check your Layout file and ViewModel class. A variable name should be the same in both files.just like:
In ViewModel class:
MutableLiveData<String> emailId = new MutableLiveData<>();
In Layout files:
<EditText
........
android:text="@={loginVM.emailId}"
Solution 5
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}"
![MidasLefko](https://i.stack.imgur.com/mJqdD.jpg?s=256&g=1)
MidasLefko
Updated on October 04, 2021Comments
-
MidasLefko over 2 years
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(); }
-
akash89 over 4 yearsThis is exactly the correct answer and must be upvoted.
-
sɐunıɔןɐqɐp over 4 yearsFrom Review: Hi, this post does not seem to provide a quality answer to the question. Please either edit your answer and improve it, or just post it as a comment.
-
MidasLefko almost 4 years