Data binding class not generated in latest studio 3.6

限于喜欢 提交于 2020-04-05 05:39:56

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!