A binding class is generated for each layout file. By default, the name of the class is based on the name of the layout file, converting it to Pascal case and adding the Binding suffix to it. The above layout filename is activity_main. xml so the corresponding generated class is ActivityMainBinding.
The BindingHolder object has a getBinding() method returning the ViewDataBinding base class. Note: The Data Binding Library generates a class named BR in the module package which contains the IDs of the resources used for data binding. In the example above, the library automatically generates the BR. item variable.
I did not get any satisfying answers. So here are the tips which are summary of my data binding knowledge.
To get more accurate errors and suggestions, I strongly recommend to update Android Studio and Gradle plugin version to the latest. Because I am not facing many issues after AS 3.2 version.
See Latest Android Studio, and Latest Gradle Plugin.
After reading this answer, you will not get stuck in data binding auto generation issues for both Classes and Data Variables.
Check these points one by one. Any of these can make your work done. Point 3 to last are really important, so don't miss them.
You should have data binding enabled in build.gradle
. If not then add this and Sync.
android {
...
buildFeatures {
dataBinding true
}
}
Now if you want data binding class to be generated then you should wrap xml layout
with data binding (<layout
tag). Something like this.
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.constraint.ConstraintLayout>
</layout>
Along with this check whether the binding variable names are correct as in the view model class
Your data binding class should be generated after creating binding layout.
If your layout name is in snake case
activity_main.xml
then data binding class will be generated in camel case likeActivityMainBinding
.
Sometimes when you type ActivityMai...
, then it does not show suggestion, in that case import manually.
import <yourpackage>databinding.ActivityMainBinding;
Your binding class and new variables in layout will not be generated if your build fails. So first Make project by Ctrl + F9 (Build > Make project).
I always do this because it takes much less time than Rebuild
/ Make
project.
Note that I prefer Close and Open from Recent because it takes much less time than Rebuild / Restart IDE.
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.)
After updating AS to Android Studio 3.2, I felt many bugs fix in data binding auto generation. So you should also have the latest AS.
#Solution for <variables
<data>
<variable
name="item"
type="com.package.Model"/>
</data>
Usually, when we put a variable in layout, it creates a getter and setter of it. And we can use binding.setItem(item);
and binding.getItem();
, but if you can't see those methods then read the below information.
If you have created a data variable - <variable
in your layout and it does not show up its setter and getter in data binding class, then Close and Open from Recent your project.
If you changed the type of some <variable
in your layout and getter setter type is not changing then Clean project (Build> Clean Project
)
Finally if still your binding class is not generated, then we have our most powerful weapon. - Restart Android Studio
This is all that i do to solve my data binding errors. If you get any further issues, you can comment here.
DataBinding class generated automatically.
if your xml name is activity_test then the Binding class will be ActivityTestBinding.
but,
dataBinding {
enabled = true
}
layout should have layout as root
<layout xmlns:android="http://schemas.android.com/apk/res/android">
</layout>
I had the same issue. After reading over the android sdk docs, there is only the expected file name to be created but nothing about what to do if it does not happen. I noticed after some more research that after removing the namespace to the layout element like below (using your example), it worked for me.
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data> </data>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
</RelativeLayout>
</layout>
In my case, the Binding class was generated and in place ( but I thought it wasn't) ... but it does not automatically add import of said class to the activity/fragment import section... so... OPTION + ENTER :)
if you do base job, for enable databainding in your project, like use enable in gradle and use layout tag in xml, when you change xml code and did not generat new databinding class for those xml you can use a fast way for generation only data binding class in gradle->other->databindinggenbaseclassesDebug it fast more than bulid whole project. its generate only databinding class.
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