Android DataBinding error. Could not find accessor

30,516

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 or getter to work and also setter 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}"
Share:
30,516
MidasLefko
Author by

MidasLefko

Updated on October 04, 2021

Comments

  • MidasLefko
    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
    akash89 over 4 years
    This is exactly the correct answer and must be upvoted.
  • sɐunıɔןɐqɐp
    sɐunıɔןɐqɐp over 4 years
    From 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
    MidasLefko almost 4 years
    mNo