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>
Antworten:
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).
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:
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.
quelle
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.
quelle
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.
quelle
Ich bin mit Android Studio 3.6.1 das Problem gelöst nach der Zugabe
viewBinding.enabled = true
zuandroid{
inbuild.gradle
:quelle
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
: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 ToolsMake Project
. Ich gehe davon aus, dass in Kürze eine vollständige Überarbeitung der Datenbindungssyntax erfolgt.quelle
Versuchen Sie, das Projekt neu zu erstellen, und prüfen Sie, ob der Datenbindungsordner in den generierten Dateien verfügbar ist
quelle
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.
quelle
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.
quelle
Ich hatte dieses Problem, weil ich meine Layouts in mehrere Verzeichnisse aufgeteilt und sie wie unten in Gradle definiert hatte
Also lege ich alle Layouts in das Hauptlayoutverzeichnis und lösche andere Unterlayoutverzeichnisse
quelle
Dies scheint mit Android Studio 3.6.3 behoben zu sein. Obwohl
arbeitete auch für mich statt
quelle