Datenbindungsklasse in neuestem Studio 3.6 nicht generiert

9

Heute habe ich mein Android Studio 3.5.3 auf 3.6 aktualisiert. Jetzt kann ich keine Datenbindungsklasse generieren. Android Studio es selbst generierende Datenbindung-IML-Datei.

Hat jemand ein solches Problem?

Gradle wrapper.properties:

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

Gradle-Datei auf Projektebene:

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

Gradle-Datei auf App-Ebene:

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

Unten finden Sie meine Aktivitäts- und XML-Dateien: Aktivität:

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>

Offizielle Lösung:

Google hat dieses Problem behoben. Nach dem Update mit dem neuen Patch von Android Studio 3.6.2 kann ich eine Datenbindungsklasse mit mehreren Quellensätzen erstellen

Mehta
quelle
Ich aktualisiere auch Studio heute selbst && benutze auch Datenbindungsklassen .. es funktioniert gut bro
Nice umang
Mach
@Niceumang Ich habe versucht, Caches ungültig zu machen und neu zu starten, zusammen mit dem Versuch, den Build-Ordner zu löschen. Aber immer noch der gleiche Fehler
Mehta
Zeigen Sie Ihr XML und Ihre Klasse an, wo Sie die Bindungsklasse erstellen?
Nizza umang
@ Niceumang Klasse und XML in Frage hinzugefügt
Mehta

Antworten:

6

Das ist mir auch passiert. Die Bindungsklassen werden tatsächlich generiert. Das Projekt funktioniert gut. Nur Android Studio 3.6.1 (oder das zugrunde liegende Gradle-Build-System, das mir egal ist) ist fehlerhaft und kann diese Klassen nicht sehen.

Als Zwischenlösung habe ich gerade die Quellensätze gehackt (bitte beachten Sie, dass Build-Varianten im folgenden Fragment spezifisch für mein Projekt sind, Sie müssen es neu schreiben).

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

Wie Steve oben sagte: In der Zwischenzeit müssen wir geduldig darauf warten, dass Google das Problem behebt ...

BEARBEITEN

Ich habe gerade festgestellt, dass es VIEL fehlerhafter ist als ich erwartet hatte, die Layouts sind auch kaputt:

Bitte, bitte, lieber Google: Geben Sie uns keine instabilen Zwischenversionen frei. "

Ich hoffe, Google wird dieses Problem bald beheben ...

BEARBEITEN 2

Ich habe wieder festgestellt, dass Android Studio 3.6 noch fehlerhafter ist als oben beschrieben.

Die Ausführung bestehender Espresso-Tests ist ebenfalls fehlerhaft.

Ich rate dringend davon ab, auf Android Studio 3.6 zu aktualisieren.

In der Zwischenzeit werden wir wahrscheinlich wieder auf Android Studio 3.5 downgraden.

Jiří Křivánek
quelle
danke .. Dieser Hack funktioniert gut .. Jetzt kann ich eine Bindungsklasse erstellen.
Mehta
Ja, ich hoffe, Google wird diesen Fehler bald beheben
Mehta
1
aber immer noch Bindungsvariablen sind in XML nicht richtig zugänglich
Mehta
Leider, wie in meiner EDIT oben erwähnt :(
Jiří Křivánek
4

Aktualisieren Sie einfach Ihre Gradle-Version auf den neuesten Stand. Gehe zu:

Datei> Projektstruktur> Gradle-Version

Und wählen Sie die neueste stabile Version (derzeit 6.3). Überprüfen Sie auch Ihre Android Gradle Plugin-Version, wenn diese auch auf die neueste Version verweist.

Rui
quelle
Danke, diese Hilfe in meinem Fall! +1
Tano
3

Für AndroidStudio 3.6.1 können Sie den folgenden Code zu build.gradle (: app) auf App-Ebene hinzufügen . Mein Problem wird durch Hinzufügen dieser Zeile gelöst, hoffe, auch Ihre.

sourceSets {
     main {
          java.srcDirs += 'build/generated/data_binding_base_class_source_out/debug/out'
        }
    }
Jack Franchi
quelle
Wie von Jiří Křivánek & you vorgeschlagen, habe ich die erwähnte Lösung hinzugefügt, aber jetzt werden alle Variablen mit roter Unterstreichung
Mehta
3

Ich bin mit Android Studio 3.6.1 das Problem gelöst nach der Zugabe viewBinding.enabled = truezu android{in build.gradle:

android {

...
    dataBinding {
        enabled = true
    }
    viewBinding.enabled = true
mhKarami
quelle
es hat funktioniert, danke Bruder
Fanadez
Es klappt!! Ich hatte die Datenbindung {enabled = true}
Billyjoker
2

Es scheint, dass es einen Fehler in der neuesten Android-Datenbindungsbibliothek gibt. Das Reinigen des Projekts hat nicht funktioniert. Der Wiederaufbau des Projekts hat nicht funktioniert. Das Ungültigmachen von Caches und das Neustarten funktionierten nicht.

Die einzige Lösung, die für mich funktioniert hat, war das Zurücksetzen der Datenbindungsversion von Version 2 (die neue Standardeinstellung in Android Studio 3.6.1 und höher) auf Version 1. Dazu müssen Sie nicht ALLE zurücksetzen Android Studio. Stattdessen können Sie die folgende Zeile hinzufügen gradle.properties:

android.databinding.enableV2=false

TLDR; Ich frage mich, ob Google beschlossen hat, die Art und Weise, wie Daten mit dem neuesten Datenbindungs-Compiler gebunden werden sollen, komplett zu überarbeiten. Es wäre nicht überraschend, wenn das Team daran arbeiten würde, YAS (eine weitere Syntax) bereitzustellen. Schließlich DataBindingUtil.inflate<MyClassBindingImpl>muss es eines der bizarrsten Verwendungsmuster in der gesamten Computerprogrammierung sein, sodass der Compiler eine konkrete Implementierung einer generischen Datenbindungsklasse automatisch generieren muss, bevor Sie auf die automatisch generierte Klasse in Ihrem Code verweisen können. Übrigens gibt es deshalb solche Tools Make Project. Ich gehe davon aus, dass in Kürze eine vollständige Überarbeitung der Datenbindungssyntax erfolgt.

rmirabelle
quelle
0

Versuchen Sie, das Projekt neu zu erstellen, und prüfen Sie, ob der Datenbindungsordner in den generierten Dateien verfügbar ist

Prakash Reddy
quelle
0

Ist mir auch passiert. Dies liegt daran, dass wir in AS 3.6.0 nicht auf die Bindung eines anderen Moduls zugreifen können, wenn wir das Include- Tag mit android: id verwenden . Ich denke, dieser Fehler ist von der IDE, weil ich das Projekt erfolgreich ausführen kann. Warten Sie nur auf die Korrektur oder ignorieren Sie den Fehler.

Steve
quelle
0

Das ist mir auch passiert. Ich habe gerade die Graddle-Version in der Datei project build.graddle auf 3.6.0 aktualisiert und jetzt funktioniert sie wieder.

oitantksi
quelle
0

Ich hatte dieses Problem, weil ich meine Layouts in mehrere Verzeichnisse aufgeteilt und sie wie unten in Gradle definiert hatte

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

}

Also lege ich alle Layouts in das Hauptlayoutverzeichnis und lösche andere Unterlayoutverzeichnisse

Marjan Davodinejad
quelle
0

Dies scheint mit Android Studio 3.6.3 behoben zu sein. Obwohl

viewBinding.enabled = true

arbeitete auch für mich statt

viewBinding {
    enabled = true
}
S.Javed
quelle