问题
Today I have updated my android studio 3.5.3 to 3.6. Now, I am not able to generate any data binding class. Android studio it self generating data-binding-iml file.
Does any one faced such issue?
Gradle wrapper.properties:
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
Project level gradle file:
dependencies {
classpath 'com.android.tools.build:gradle:3.5.3'
}
App level gradle file:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: 'androidx.navigation.safeargs'
android {
dataBinding {
enabled = true
}
// Using Lambda Expressions
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
}
gradle.properties:
kotlin.code.style=official
android.databinding.enableV2=true
kotlin.incremental=true
kapt.incremental.apt=true
Below is my Activity and XML files: Activity:
class ActivityMain : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
var binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
}
}
XML:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<import type="android.view.View" />
<!-- <variable
name="loading"
type="Boolean" />-->
<variable
name="bottomMenu"
type="Boolean" />
<variable
name="clickListener"
type="com.ecom.side_menu.SideMenuClickHandler" />
</data>
<androidx.drawerlayout.widget.DrawerLayout
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:fitsSystemWindows="false"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:id="@+id/layToolbar"
layout="@layout/layout_toolbar"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.fragment.app.FragmentContainerView
android:id="@+id/splash_host"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@android:color/white"
app:defaultNavHost="true"
app:layout_constraintBottom_toTopOf="@+id/bottomNavigationView"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/layToolbar"
app:navGraph="@navigation/splash_graph" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottomNavigationView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="0dp"
android:layout_marginEnd="0dp"
android:background="@color/colorPrimary"
android:visibility="@{safeUnbox(bottomMenu) ? View.VISIBLE : View.GONE}"
app:itemBackground="@color/colorPrimary"
app:itemIconTint="@android:color/white"
app:itemTextColor="@android:color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:menu="@menu/menu_navigation_dashboard" />
<!-- <include
android:id="@+id/progressLayoutId"
layout="@layout/layout_progress"
android:visibility="@{safeUnbox(loading) ? View.VISIBLE : View.GONE}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />-->
</androidx.constraintlayout.widget.ConstraintLayout>
<com.google.android.material.navigation.NavigationView
android:id="@+id/navigationView"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@android:color/white"
android:fitsSystemWindows="true"
android:visibility="visible">
<include
android:id="@+id/customDrawerList"
app:clickListener="@{clickListener}"
layout="@layout/drawer_list" />
</com.google.android.material.navigation.NavigationView>
</androidx.drawerlayout.widget.DrawerLayout>
</layout>
Official solution:
Google has resolved this issue. After updating with new patch of android studio 3.6.2, I am able to create databinding class with multiple source set
回答1:
This happened to me as well. The binding classes are actually generated. The project builds fine. Only Android Studio 3.6.1 (or underlying Gradle build system, I do not care) is buggy and cannot see these classes.
As an intermediate solution, I just hacked the source sets (please note that build variants in the fragment below are specific to my project, you need to rewrite it).
android {
...
sourceSets {
demoDebug {
java.srcDirs += 'build/generated/data_binding_base_class_source_out/demoDebug/out'
}
fullDebug {
java.srcDirs += 'build/generated/data_binding_base_class_source_out/fullDebug/out'
}
espressoDebug {
java.srcDirs += 'build/generated/data_binding_base_class_source_out/espressoDebug/out'
}
demoRelease {
java.srcDirs += 'build/generated/data_binding_base_class_source_out/demoRelease/out'
}
fullRelease {
java.srcDirs += 'build/generated/data_binding_base_class_source_out/fullRelease/out'
}
espressoRelease {
java.srcDirs += 'build/generated/data_binding_base_class_source_out/espressoRelease/out'
}
}
...
}
As pointed by Steve above: In the mean time, we have to patiently wait for Google to fix it...
EDIT
I have just realised it is MUCH more buggy than I expected, the layouts are broken too:
I hope Google will fix this mess soon...
EDIT 2
I have realized again that Android Studio 3.6 is even more buggy than described above.
The execution of existing Espresso tests is broken too.
I strongly discourage everyone from upgrading to Android Studio 3.6.
I the mean time, we will probably downgrade back to Android Studio 3.5.
回答2:
Just update your Gradle version to the latest. Go to:
File > Project Structure > Gradle Version
And select the latest stable version (currently 6.3). Check also your Android Gradle Plugin Version if it's also pointing to the latest.
回答3:
For AndroidStudio 3.6.1, You can add below code in to app level build.gradle(:app). My problem is solved by adding this line, hope your's too.
sourceSets {
main {
java.srcDirs += 'build/generated/data_binding_base_class_source_out/debug/out'
}
}
回答4:
I am using android studio 3.6.1
the problem solved after adding viewBinding.enabled = true
to android{
in build.gradle
:
android {
...
dataBinding {
enabled = true
}
viewBinding.enabled = true
回答5:
Try re-building project and see whether data binding folder is available in generated files
回答6:
Also happened to me. This is because in AS 3.6.0, we can't access binding from another module if we use include tag with android:id. I think this error is from the IDE because i can run the project successfully. The only thing to do is wait for the fix or just ignore the error.
回答7:
It happened to me too. I just upgraded Graddle version to 3.6.0 on project build.graddle file and now it's working again.
回答8:
i had this problem cause i had separate my layouts into several directory and define them in gradle like bellow
sourceSets {
main {
res.srcDirs =
[
'src/main/res', 'src/main/drawable/button_icons', 'src/main/res/drawable/button_icons',
'src/main/res', 'src/main/layouts/user', 'src/main/res/layouts/user',
'src/main/res/layouts', 'src/main/layouts/user', 'src/main/res/layouts/user/register',
'src/main/res/layouts', 'src/main/layouts/user', 'src/main/res/layouts/user/login',
'src/main/res/layouts', 'src/main/layouts/user', 'src/main/res/layouts/user/profile',
'src/main/res/layouts', 'src/main/layouts/user', 'src/main/res/layouts/user/wallet',
'src/main/res/layouts/splash_layouts', 'src/main/res/layouts', 'src/main/res',
'src/main/res/layouts/main_layouts', 'src/main/res/layouts', 'src/main/res',
'src/main/res/layouts/main_layouts/sellers', 'src/main/res/layouts/main_layouts', 'src/main/res/layouts',
'src/main/res/layouts/dashboard_layouts', 'src/main/res/layouts', 'src/main/res',
'src/main/res/layouts/basket_layouts', 'src/main/res/layouts', 'src/main/res',
'src/main/res/layouts/factor_layouts', 'src/main/res/layouts', 'src/main/res',
'src/main/res/layouts/setting_layouts', 'src/main/res/layouts', 'src/main/res',
]
}
}
So I put all the layouts in the main layout directory and delete other sub layout directories
回答9:
It does appear there's a bug in the latest Android data binding library. Cleaning the project did not work. Rebuilding the project did not work. Invalidating caches and restarting did not work.
The ONLY solution that worked for me was rolling back the data binding version from version 2 (which is the new default in Android Studio 3.6.1 and higher) to version 1. To do this, you don't have to roll back ALL of Android Studio. Instead you can add the following line to gradle.properties
:
android.databinding.enableV2=false
TLDR; I'm wondering whether Google has decided to completely revamp the way we're supposed to do data binding with their latest data binding compiler. It wouldn't be surprising if the team was working to provide YAS (yet another syntax). After all, DataBindingUtil.inflate<MyClassBindingImpl>
has got to be one of the most bizarre usage patterns in all of computer programming, requiring the compiler to auto-generate a concrete implementation of a generic data binding class BEFORE you can reference the auto-generated class in your code. BTW, this is why tools like Make Project
exist. I half-expect a complete overhaul to the data binding syntax to arrive shortly.
来源:https://stackoverflow.com/questions/60393905/data-binding-class-not-generated-in-latest-studio-3-6