I am getting started for using DataBinding
feature. I am facing problem with it.
Error:(21, 9) error: cannot find symbol class ContactL
You can see Main Answer for complete information about data binding errors and solutions. I will try to tell some important points below.
Assuming that you have enabled data binding in build.gradle
and you have converted your layout to binding layout.
First of all binding class auto generate when you convert layout to binding layout. Still sometimes it is not generated when background threads are not working. Here are some tips for you to resolve this.
(1) Name of generated class
Layout name is in snake_case activity_main.xml
Data binding class will be in PascalCase like ActivityMainBinding
.
(2). Type full name of Binding class
I felt sometimes when you type ActivityMai...
, then it does not show suggestion, but that does not mean class is not generated. In that case you should type full name of expected generated class. Like type ActivityMainBinding
and it will show import popup. (That's what i faced many times.)
Still not getting import suggestion. Try manual import.
import <yourpackage>databinding.ActivityMainBinding;
(3). Rebuild Project
If still your class is not generated. (Some time when we paste layout file, then it happens). Then Rebuild Project from Build> Rebuild
(Not Build or Make project). It will generate your data binding class. (Rebuild does Magic for me all times.)
(4) If you have created an <variable
in your layout and it does not show up its setter and getter in data binding class, then follow 4th point.
(5) Still if your class is not generating then you should check if build is not failing due to an error in your layout file. Data binding class will generate with a successful build.
This is all what i do to solve my data binding errors. If you get any further issue, you can comment here.
For me it was an error in the layout xml binding, I had
app:setNameString="@{person}"
instead of
app:nameString="@{person}"
the type name must match the name you have set up in the @BindingAdapter class (if you are using binding adapter)
In my project it was a trouble in:
android:text="@{safeUnbox(viewmodel.population)}"
So I've wrapped it in String.valueOf()
:
android:text="@{String.valueOf(safeUnbox(viewmodel.population))}"
And it was resolved
this is your code
ContactListActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_contact_list);
Replace this code
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_contact_list);
You need to declare and pass the binding in the activity layout, not in the included layout.
Example from the documentation:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://schemas.android.com/apk/res-auto">
<data>
<variable name="user" type="com.example.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/name"
bind:user="@{user}"/>
<include layout="@layout/contact"
bind:user="@{user}"/>
</LinearLayout>
</layout>
Here, there must be a user variable in both the name.xml and contact.xml layout files.
You must change your activity_contact_list
to be binded - add layout tag as you did in content_contact_list
. Don't forget, The root layout inside activity_contact_list
must have an id for the Binding class to be generated and will be named ActivityContactListBinding (i.e. the name of the layout with camel casting instead of underscores).
Next, inside activity_contact_list
, give <include layout="@layout/content_contact_list" />
an id, then you will have access for its binding instance through your ActivityContactListBinding instance.
Somthing like:
binding.contentContactList.setContact(user);
Let me know if it works.