Classe di associazione dei dati non generata nell'ultimo studio 3.6


9

Oggi ho aggiornato il mio studio Android da 3.5.3 a 3.6. Ora, non sono in grado di generare alcuna classe di associazione dei dati. Android Studio è un file iml auto-generatore di associazione dei dati.

Qualcuno ha affrontato tale problema?

Gradle wrapper.properties:

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

File di valutazione a livello di progetto:

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

File di valutazione a livello di app:

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

Di seguito sono riportati i miei file Attività e XML: Attività:

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>

Soluzione ufficiale:

Google ha risolto questo problema. Dopo l'aggiornamento con la nuova patch di Android Studio 3.6.2, sono in grado di creare una classe di database con set di sorgenti multiple


Oggi aggiorno anche Studio stesso && uso anche classi di associazione dati.
Funziona benissimo

invalida la cache e riavvia il tuo studio;)
Bello, il

@Niceumang Ho provato a invalidare le cache e a riavviare, insieme a ho provato a eliminare anche la cartella di build .. Ma sempre lo stesso errore
Mehta

mostrerai il tuo XML e la classe in cui crei la classe vincolante?
Bello il

Classe @Niceumang e XML aggiunti in questione
Mehta

Risposte:


6

Questo è successo anche a me. Le classi di legame sono effettivamente generate. Il progetto si sviluppa bene. Solo Android Studio 3.6.1 (o il sistema di generazione Gradle sottostante, non mi interessa) è difettoso e non può vedere queste classi.

Come soluzione intermedia, ho appena hackerato i set di sorgenti (tieni presente che le varianti di build nel frammento di seguito sono specifiche del mio progetto, devi riscriverle).

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

Come sottolineato da Steve sopra: nel frattempo, dobbiamo aspettare pazientemente che Google lo risolva ...

MODIFICARE

Ho appena realizzato che è MOLTO più buggy di quanto mi aspettassi, anche i layout sono rotti:

Per favore, caro Google: non rilasciarci versioni intermedie instabili "

Spero che Google risolva presto questo casino ...

MODIFICA 2

Mi sono reso di nuovo conto che Android Studio 3.6 è ancora più difettoso di quanto descritto sopra.

Anche l'esecuzione dei test Espresso esistenti è stata interrotta.

Scoraggio vivamente a tutti dall'aggiornamento ad Android Studio 3.6.

Nel frattempo, probabilmente eseguiremo il downgrade ad Android Studio 3.5.


grazie .. Questo trucco funziona bene .. Ora sono in grado di creare una classe Binding.
Mehta

Sì, spero che Google risolva presto questo errore
Mehta

1
ma le variabili ancora vincolanti non sono accessibili correttamente in xml
Mehta

Sfortunatamente, come menzionato nel mio EDIT sopra :(
Jiří Křivánek il

4

Aggiorna la tua versione Gradle alla più recente. Vai a:

File> Struttura del progetto> Versione gradle

E seleziona l'ultima versione stabile (attualmente 6.3). Controlla anche la tua versione del plug-in Android Gradle se punta anche alle ultime.


Grazie, questo aiuto nel mio caso! +1
Tano

3

Per AndroidStudio 3.6.1 , puoi aggiungere il codice seguente in build.gradle a livello di app (: app) . Il mio problema è risolto aggiungendo questa linea, spero anche il tuo.

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

come suggerito da Jiří Křivánek e da te, ho aggiunto la soluzione menzionata ma ora tutte le variabili vengono visualizzate con una sottolineatura rossa .. impossibile accedere
Mehta

3

Sto usando Android Studio 3.6.1 il problema risolto dopo aver aggiunto viewBinding.enabled = truea android{in build.gradle:

android {

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

ha funzionato, grazie fratello
Fanadez il

Funziona!! mi mancava il dataBinding {enabled = true}
Billyjoker il

2

Sembra che ci sia un bug nell'ultima libreria di associazione dei dati Android. La pulizia del progetto non ha funzionato. La ricostruzione del progetto non ha funzionato. Le cache invalidanti e il riavvio non hanno funzionato.

L'unica soluzione che ha funzionato per me è stata il rollback della versione di associazione dei dati dalla versione 2 (che è il nuovo predefinito in Android Studio 3.6.1 e versioni successive) alla versione 1. Per fare ciò, non è necessario ripristinare TUTTI Android Studio. Invece puoi aggiungere la seguente riga a gradle.properties:

android.databinding.enableV2=false

TLDR; Mi chiedo se Google abbia deciso di rinnovare completamente il modo in cui dovremmo fare l'associazione dei dati con il loro ultimo compilatore di associazione dei dati. Non sarebbe sorprendente se il team stesse lavorando per fornire YAS (ancora un'altra sintassi). Dopotutto, DataBindingUtil.inflate<MyClassBindingImpl>deve essere uno dei modelli di utilizzo più bizzarri di tutta la programmazione per computer, che richiede al compilatore di generare automaticamente un'implementazione concreta di una classe di associazione di dati generica PRIMA di poter fare riferimento alla classe generata automaticamente nel codice. A proposito, ecco perché Make Projectesistono strumenti come . Mi aspetto quasi che una revisione completa della sintassi di associazione dei dati arrivi a breve.


0

Prova a ricostruire il progetto e vedi se la cartella di associazione dei dati è disponibile nei file generati


0

Mi è successo anche. Questo perché in AS 3.6.0, non possiamo accedere all'associazione da un altro modulo se utilizziamo il tag include con android: id . Penso che questo errore provenga dall'IDE perché posso eseguire correttamente il progetto. L'unica cosa da fare è attendere la correzione o semplicemente ignorare l'errore.


0

È successo anche a me. Ho appena aggiornato la versione Graddle alla 3.6.0 sul file build.graddle del progetto e ora funziona di nuovo.


0

ho avuto questo problema perché avevo separato i miei layout in diverse directory e li ho definiti in gradi come qui sotto

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

}

Quindi ho inserito tutti i layout nella directory del layout principale ed ho eliminato altre directory del layout secondario


0

Questo sembra essere stato risolto con Android Studio 3.6.3. Sebbene

viewBinding.enabled = true

ha funzionato anche per me anziché

viewBinding {
    enabled = true
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.