Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android DataBinding error. Could not find accessor

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();
}
like image 494
MidasLefko Avatar asked Sep 20 '15 19:09

MidasLefko


3 Answers

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.

like image 56
MidasLefko Avatar answered Nov 06 '22 01:11

MidasLefko


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.
like image 21
Khemraj Sharma Avatar answered Nov 06 '22 02:11

Khemraj Sharma


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}"
like image 3
Sanjeev Avatar answered Nov 06 '22 02:11

Sanjeev