Classe de liaison de données non générée dans le dernier studio 3.6


9

Aujourd'hui, j'ai mis à jour mon studio Android 3.5.3 à 3.6. Maintenant, je ne peux pas générer de classe de liaison de données. Android studio, il génère automatiquement un fichier iml de liaison de données.

Quelqu'un at-il été confronté à un tel problème?

Gradle wrapper.properties:

distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip

Fichier de notes de niveau projet:

dependencies {
        classpath 'com.android.tools.build:gradle:3.5.3'
}

Fichier de notes au niveau de l'application:

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

Voici mes fichiers d'activité et XML: Activité:

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>

Solution officielle:

Google a résolu ce problème. Après la mise à jour avec le nouveau patch d'Android Studio 3.6.2, je suis capable de créer une classe de liaison de données avec un ensemble de sources multiples


Je mets également à jour le studio aujourd'hui lui-même et j'utilise également des classes de liaison de données .. ça marche bien bro
Nice umang

invalidez simplement les caches et redémarrez votre studio;)
Nice umang

@Niceumang J'ai essayé d'invalider les caches et de redémarrer, et j'ai aussi essayé de supprimer le dossier de build .. Mais toujours la même erreur
Mehta

allez-vous montrer votre XML et votre classe où vous créez une classe de liaison?
Nice umang

@Niceumang class et XML ajoutés en question
Mehta

Réponses:


6

Cela m'est aussi arrivé. Les classes de liaison sont réellement générées. Le projet se construit bien. Seul Android Studio 3.6.1 (ou le système de construction Gradle sous-jacent, je m'en fiche) est bogué et ne peut pas voir ces classes.

En tant que solution intermédiaire, je viens de pirater les ensembles source (veuillez noter que les variantes de construction dans le fragment ci-dessous sont spécifiques à mon projet, vous devez le réécrire).

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'
        }
    }
    ...
}

Comme l'a souligné Steve ci-dessus: En attendant, nous devons attendre patiemment que Google le corrige ...

ÉDITER

Je viens de réaliser qu'il est BEAUCOUP plus buggé que ce à quoi je m'attendais, les dispositions sont également cassées:

S'il vous plaît, cher Google: ne nous communiquez pas de versions intermédiaires instables "

J'espère que Google corrigera bientôt ce gâchis ...

EDIT 2

J'ai réalisé à nouveau qu'Android Studio 3.6 est encore plus bogué que décrit ci-dessus.

L'exécution des tests Espresso existants est également interrompue.

Je décourage fortement tout le monde de passer à Android Studio 3.6.

Entre-temps, nous allons probablement revenir à Android Studio 3.5.


merci .. Ce hack fonctionne bien .. Maintenant, je suis capable de créer une classe de liaison.
Mehta

Oui, j'espère que Google corrigera bientôt ce bogue
Mehta

1
mais les variables toujours contraignantes ne sont pas accessibles correctement en xml
Mehta

Malheureusement, comme mentionné dans mon EDIT ci-dessus :(
Jiří Křivánek

4

Mettez simplement à jour votre version Gradle vers la dernière. Aller à:

Fichier> Structure du projet> Version Gradle

Et sélectionnez la dernière version stable (actuellement 6.3). Vérifiez également votre version du plug-in Android Gradle si elle pointe également vers la dernière version.


Merci, cette aide dans mon cas! +1
Tano

3

Pour AndroidStudio 3.6.1 , vous pouvez ajouter le code ci-dessous au niveau de l'application build.gradle (: app) . Mon problème est résolu en ajoutant cette ligne, j'espère que la vôtre aussi.

sourceSets {
     main {
          java.srcDirs += 'build/generated/data_binding_base_class_source_out/debug/out'
        }
    }

comme suggéré par Jiří Křivánek et vous, j'ai ajouté la solution mentionnée, mais maintenant, toutes les variables s'affichent avec un soulignement rouge .. impossible d'accéder
Mehta

3

J'utilise studio android 3.6.1 le problème résolu après avoir ajouté viewBinding.enabled = trueà android{dans build.gradle:

android {

...
    dataBinding {
        enabled = true
    }
    viewBinding.enabled = true

ça a fonctionné, thx bro
Fanadez

Ça marche!! il me manquait le dataBinding {enabled = true}
Billyjoker

2

Il semble qu'il y ait un bogue dans la dernière bibliothèque de liaison de données Android. Le nettoyage du projet n'a pas fonctionné. La reconstruction du projet n'a pas fonctionné. L'invalidation des caches et le redémarrage n'ont pas fonctionné.

La SEULE solution qui a fonctionné pour moi consistait à restaurer la version de liaison de données de la version 2 (qui est la nouvelle valeur par défaut dans Android Studio 3.6.1 et supérieur) à la version 1. Pour ce faire, vous n'avez pas à restaurer TOUT Android Studio. Au lieu de cela, vous pouvez ajouter la ligne suivante à gradle.properties:

android.databinding.enableV2=false

TLDR; Je me demande si Google a décidé de réorganiser complètement la façon dont nous sommes censés faire la liaison de données avec leur dernier compilateur de liaison de données. Il ne serait pas surprenant que l'équipe travaille à fournir YAS (encore une autre syntaxe). Après tout, DataBindingUtil.inflate<MyClassBindingImpl>doit être l'un des modèles d'utilisation les plus bizarres de toute la programmation informatique, obligeant le compilateur à générer automatiquement une implémentation concrète d'une classe de liaison de données générique AVANT de pouvoir référencer la classe générée automatiquement dans votre code. BTW, c'est pourquoi des outils comme Make Projectexistent. Je m'attends à moitié à une refonte complète de la syntaxe de liaison de données pour arriver sous peu.


0

Essayez de reconstruire le projet et voyez si le dossier de liaison de données est disponible dans les fichiers générés


0

Il m'est aussi arrivé. En effet, dans AS 3.6.0, nous ne pouvons pas accéder à la liaison à partir d'un autre module si nous utilisons la balise include avec android: id . Je pense que cette erreur provient de l'IDE car je peux exécuter le projet avec succès. La seule chose à faire est d'attendre le correctif ou simplement d'ignorer l'erreur.


0

Ça m'est aussi arrivé. Je viens de mettre à niveau la version Graddle vers 3.6.0 sur le fichier build.graddle du projet et maintenant cela fonctionne à nouveau.


0

j'ai eu ce problème parce que j'avais séparé mes mises en page dans plusieurs répertoires et les définir en gradle comme ci-dessous

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',
                ]
    }

}

J'ai donc mis toutes les mises en page dans le répertoire de mise en page principal et je supprime les autres sous-répertoires de mise en page


0

Cela semble être corrigé avec Android studio 3.6.3. Bien que

viewBinding.enabled = true

travaillé pour moi aussi au lieu de

viewBinding {
    enabled = true
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.