Klasa powiązania danych nie została wygenerowana w najnowszym studio 3.6

11

Dzisiaj zaktualizowałem moje studio Android od 3.5.3 do 3.6. Teraz nie jestem w stanie wygenerować żadnej klasy powiązania danych. Android studio to samo-generujący plik iml wiążący dane.

Czy ktoś napotkał taki problem?

Gradle wrapper.properties:

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

Plik oceny na poziomie projektu:

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

Plik oceny na poziomie aplikacji:

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

Poniżej moja aktywność i pliki XML: Aktywność:

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>

Oficjalne rozwiązanie:

Google rozwiązało ten problem. Po aktualizacji z nową łatką Androida Studio 3.6.2 jestem w stanie stworzyć klasę wiązania danych z wieloma zestawami źródeł

Mehta
źródło
Również dziś aktualizuję studio i && używam też klas powiązania danych.
Działa
po prostu unieważnij pamięci podręczne i uruchom ponownie studio;)
Niezły
@Niceumang Próbowałem unieważnić pamięci podręczne i uruchomić ponownie, próbowałem też usunąć folder kompilacji. Ale wciąż ten sam błąd
Mehta
pokażesz XML i klasę, w której tworzysz klasę wiążącą?
Niezły
Dodano klasę @Niceumang i dodano XML
Mehta

Odpowiedzi:

6

To mi się też przydarzyło. Klasy powiązań są generowane. Projekt działa dobrze. Tylko Android Studio 3.6.1 (lub podstawowy system kompilacji Gradle, nie obchodzi mnie to) jest wadliwy i nie widzi tych klas.

Jako rozwiązanie pośrednie właśnie zhakowałem zestawy źródłowe (pamiętaj, że warianty kompilacji w poniższym fragmencie są specyficzne dla mojego projektu, musisz go przepisać).

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

Jak wskazał Steve powyżej: w międzyczasie musimy cierpliwie czekać, aż Google go naprawi ...

EDYTOWAĆ

Właśnie zdałem sobie sprawę, że jest O wiele bardziej wadliwy niż się spodziewałem, układy też są zepsute:

Proszę, drogi Google: nie udostępniaj nam niestabilnych wersji pośrednich ”

Mam nadzieję, że Google wkrótce naprawi ten bałagan ...

EDYCJA 2

Znowu zdałem sobie sprawę, że Android Studio 3.6 jest jeszcze bardziej wadliwy niż opisano powyżej.

Wykonanie istniejących testów espresso również jest zepsute.

Zdecydowanie odradzam wszystkim przejście na system Android Studio 3.6.

Tymczasem prawdopodobnie powrócimy do wersji Android Studio 3.5.

Jiří Křivánek
źródło
dzięki .. Ten hack działa dobrze .. Teraz jestem w stanie stworzyć klasę Binding.
Mehta
Tak, mam nadzieję, że Google wkrótce naprawi ten błąd
Mehta
1
ale nadal wiążące zmienne nie są poprawnie dostępne w xml
Mehta
Niestety, jak wspomniano w moim EDIT powyżej :(
Jiří Křivánek
4

Używam android studio 3.6.1 problem rozwiązany po dodaniu viewBinding.enabled = truedo android{w build.gradle:

android {

...
    dataBinding {
        enabled = true
    }
    viewBinding.enabled = true
mhKarami
źródło
zadziałało, dzięki bracie
Fanadez
To działa!! brakowało mi dataBinding {enabled = true}
Billyjoker
4

Po prostu zaktualizuj wersję Gradle do najnowszej. Iść do:

Plik> Struktura projektu> Wersja stopniowa

I wybierz najnowszą stabilną wersję (obecnie 6.3). Sprawdź także wersję wtyczki Gradle dla Androida, jeśli wskazuje ona również najnowszą wersję.

Rui
źródło
Dzięki, ta pomoc w moim przypadku! +1
Tano
3

W przypadku AndroidStudio 3.6.1 możesz dodać poniższy kod do poziomu aplikacji build.gradle (: app) . Mój problem został rozwiązany przez dodanie tej linii, mam nadzieję, że Ty też.

sourceSets {
     main {
          java.srcDirs += 'build/generated/data_binding_base_class_source_out/debug/out'
        }
    }
Jack Franchi
źródło
jak zasugerował Jiří Křivánek i ty, dodałem wspomniane rozwiązanie, ale teraz wszystkie zmienne są wyświetlane z czerwonym podkreśleniem .. nie można uzyskać dostępu
Mehta
2

Wygląda na to, że w najnowszej bibliotece powiązań danych Androida występuje błąd. Czyszczenie projektu nie działało. Przebudowa projektu nie działała. Unieważnianie pamięci podręcznej i ponowne uruchamianie nie działało.

JEDYNYM rozwiązaniem, które działało dla mnie, było wycofanie wersji powiązania danych z wersji 2 (która jest nowym domyślnym w Android Studio 3.6.1 i nowszym) do wersji 1. Aby to zrobić, nie musisz przywracać WSZYSTKICH Android Studio. Zamiast tego możesz dodać następujący wiersz gradle.properties:

android.databinding.enableV2=false

TLDR; Zastanawiam się, czy Google zdecydowało się całkowicie zmienić sposób, w jaki powinniśmy wykonywać powiązanie danych za pomocą ich najnowszego kompilatora powiązań danych. Nie byłoby zaskoczeniem, gdyby zespół pracował nad dostarczeniem YAS (kolejna składnia). W końcu DataBindingUtil.inflate<MyClassBindingImpl>musi to być jeden z najdziwniejszych wzorców użytkowania we wszystkich programach komputerowych, wymagający od kompilatora automatycznego wygenerowania konkretnej implementacji ogólnej klasy powiązania danych PRZED odwołaniem do automatycznie wygenerowanej klasy w kodzie. BTW, właśnie dlatego Make Projectistnieją takie narzędzia . Oczekuję, że niedługo nastąpi całkowity przegląd składni wiązania danych.

rmirabelle
źródło
1

miałem ten problem, ponieważ podzieliłem moje układy na kilka katalogów i zdefiniowałem je w stopniach jak poniżej

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

}

Umieszczam więc wszystkie układy w głównym katalogu układów i usuwam inne podkatalogi

Marjan Davodinejad
źródło
0

Spróbuj ponownie zbudować projekt i sprawdź, czy folder powiązania danych jest dostępny w wygenerowanych plikach

Prakash Reddy
źródło
0

Też mi się przydarzyło. Wynika to z faktu, że w AS 3.6.0 nie możemy uzyskać dostępu do wiązania z innego modułu, jeśli użyjemy tagu dołączania z Androidem: id . Myślę, że ten błąd pochodzi z IDE, ponieważ mogę pomyślnie uruchomić projekt. Jedyne, co należy zrobić, to poczekać na poprawkę lub po prostu zignorować błąd.

Steve
źródło
0

To mi się też przydarzyło. Właśnie uaktualniłem wersję Graddle do wersji 3.6.0 w pliku build.graddle projektu i teraz znów działa.

oitantksi
źródło
0

Wydaje się, że zostało to naprawione w Android Studio 3.6.3. Mimo że

viewBinding.enabled = true

pracował dla mnie również zamiast

viewBinding {
    enabled = true
}
S.Javed
źródło
Potwierdza, że ​​nie działa w 3.6.3
Androidzie
Proszę podać kontekst. Co to za kod? Dokąd to zmierza?
Stealth Rabbi