Classe di associazione dati non generata


96

Sto usando il Data Binding nel mio progetto, quando uso <layout>e <data>nella mia classe di binding xml non viene generata.

Ad esempio, ho activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>    </data>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </RelativeLayout>
</layout>

Ora se sto scrivendo ActivityMainBindingnella mia attività / frammento mostra l'errore che la classe non è disponibile. Ma dopo averlo incluso <variable>nel mio file xml, è in grado di generare ActivityMainBindingclass.

Android Studio: 2.1.3
Classpath: com.android.tools.build:gradle:2.1.3
minSdkVersion 16
targetSdkVersion 24
buildToolsVersion 24.0.0


2
è dataBinding.enablednel tuo build.gradle?
pskink

2
Penso che questo sia un errore noto. Puoi provare a costruire il tuo progetto prima di provare ad accedere ActivityMainBinding, o ha a che fare con questo bug.
yennsarah

@pskink sì, è per questo che sta generando una classe di associazione dopo aver aggiunto <variable>xml
Ravi

@Amylinn dopo aver costruito il mio progetto genera, ma la mia domanda è quando scrivo <variable>, genera una classe vincolante senza costruire un progetto.
Ravi

ah, davvero, mi mancava
pskink

Risposte:


214

Non ho ricevuto risposte soddisfacenti. Quindi ecco i suggerimenti che sono un riepilogo delle mie conoscenze sull'associazione dei dati.

Suggerimenti per la risoluzione dei problemi di associazione dei dati

Aggiornare

Per ottenere errori e suggerimenti più accurati , consiglio vivamente di aggiornare la versione del plug-in Android Studio e Gradle all'ultima. Perché non sto affrontando molti problemi dopo la versione AS 3.2.

Guarda l' ultimo Android Studio e l' ultimo plug-in Gradle .

Soluzione originale

Dopo aver letto questa risposta, non rimarrai bloccato in problemi di generazione automatica di associazione dati per classi e variabili di dati .

Controlla questi punti uno per uno. Ognuno di questi può fare il tuo lavoro. Il punto 3 per ultimo è molto importante, quindi non perderlo.

1. Verificare se l'associazione dati è abilitata

Dovresti avere il data binding abilitato in build.gradle. In caso contrario, aggiungi questo e Sync .

android {
...
   dataBinding {
        enabled = true
    }
...
}

2. Il layout di verifica viene convertito in layout di rilegatura

Ora, se si desidera generare la classe di associazione dati, è necessario eseguire il wrapping xml layoutcon l'associazione dati ( <layouttag). Qualcosa come questo.

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.constraint.ConstraintLayout>
</layout>

Insieme a questo, controlla se i nomi delle variabili di associazione sono corretti come nella classe del modello di visualizzazione

3. Nome classe Binding generato automaticamente?

La classe di associazione dati dovrebbe essere generata dopo aver creato il layout di associazione.

Se il nome layout è in caso di serpente activity_main.xml , allora i dati di classe vincolante verrà generato in caso di cammello come ActivityMainBinding.

4. Non riesci a visualizzare il suggerimento di importazione?

A volte durante la digitazione ActivityMai..., non viene visualizzato alcun suggerimento , in tal caso importa manualmente .

import <yourpackage>databinding.ActivityMainBinding;

5. Leggere Build Fail Logcat

La tua classe di associazione e le nuove variabili nel layout non verranno generate se la tua build fallisce. Quindi prima Crea progetto con Ctrl + F9 (Compila> Crea progetto) .

  • Se una build fallisce, vedi cos'è un errore, di solito abbiamo errori nei campi di layout. I log degli errori indicheranno il numero della riga di errore con il problema.
  • Il binding potrebbe non riuscire e causare errori stupidi , come errori di sintassi o importazione mancante. In tal caso, otterrai logcat pieno di errori di classi di binding. Ma dovresti leggere logcat completo per trovare il problema appropriato .

6. Chiudere e aprire il progetto dal recente

Lo faccio sempre perché richiede molto meno tempo di Rebuild/ Makeproject.

  • Chiudi progetto da File> Chiudi progetto
  • Apri di nuovo da recente

Nota che preferisco Chiudi e Apri da recenti perché richiede molto meno tempo rispetto a Ricostruisci / Riavvia IDE .

7. Ricostruire il progetto

Se ancora la tua classe non viene generata. (Qualche volta quando incolliamo il file di layout, allora succede). Quindi ricostruire il progetto da Build> Rebuild( Non creare o creare progetto ). Genererà la tua classe di associazione dati. ( Rebuild fa Magic per me. )

8. Avere l'ultima versione di Android Studio

Dopo aver aggiornato AS ad Android Studio 3.2 , ho sentito molti bug risolti nella generazione automatica del data binding. Quindi dovresti anche avere l'ultima versione di AS.

Soluzione per <variables

<data>
    <variable
        name="item"
        type="com.package.Model"/>
</data>

Di solito, quando mettiamo una variabile nel layout, ne crea un getter e setter. E possiamo usare binding.setItem(item);e binding.getItem();, ma se non riesci a vedere questi metodi, leggi le informazioni seguenti.

1. Chiudere e aprire il progetto dal recente

Se hai creato una variabile di dati - <variablenel tuo layout e non mostra il suo setter e getter nella classe di data binding, quindi Chiudi e Apri da Recenti il tuo progetto.

2. Pulisci il progetto dopo aver cambiato il tipo

Se hai cambiato il tipo di alcuni <variablenel tuo layout e il tipo di getter setter non cambia, allora Clean project ( Build> Clean Project)

Parole finali

Infine, se la tua classe vincolante non viene ancora generata, allora abbiamo la nostra arma più potente. - Riavvia Android Studio: D

  • Per prima cosa, prova a riavviare , questo genera sempre variabili del mio layout di associazione dopo il riavvio.
  • Se non funziona, Invalidate Cache & Restart .

Questo è tutto ciò che faccio per risolvere i miei errori di associazione dei dati. Se riscontri ulteriori problemi, puoi commentare qui.


2
Se il problema persiste ... (8) Invalida e riavvia .... se non risolto, (9) modifica dataBinding {enabled = false} ... build, quindi dataBinding {enabled = true} build di nuovo ....
PravyNandas


1
Nel mio caso, ho dovuto importare manualmente il classpath per qualche motivo l'IDE non lo mostra come una soluzione. Tnx :)
Ivan Kaloyanov

2
Mi ha salvato la giornata. Mi mancava l'involucro <layout> nel mio file di layout. Grazie!
Juliano

Puoi anche aggiungere che "import android.R" deve essere rimosso, se fa parte dell'elenco di importazione. Questo ha risolto il mio problema con il riferimento non risolto al file xml dell'attività
Tim John

23

Classe DataBinding generata automaticamente.

se il tuo nome xml è activity_test, la classe Binding sarà ActivityTestBinding.

ma,

dataBinding {
        enabled = true
    }

layout dovrebbe avere layout come root

<layout xmlns:android="http://schemas.android.com/apk/res/android">
</layout>

Cerco l'anima per ore, faccio molta magia gradle, ma la uso ConstraintLayoutcome radice. Grazie!
Alexey Markov

14

Ho avuto lo stesso problema. Dopo aver letto i documenti di Android SDK, c'è solo il nome del file previsto da creare ma niente su cosa fare se non accade. Ho notato dopo qualche altra ricerca che dopo aver rimosso lo spazio dei nomi nell'elemento layout come sotto (usando il tuo esempio), ha funzionato per me.

    <?xml version="1.0" encoding="utf-8"?>
    <layout>
        <data>  </data>
        <RelativeLayout
           xmlns:android="http://schemas.android.com/apk/res/android"
           android:layout_width="match_parent"
           android:layout_height="match_parent">
        </RelativeLayout>
    </layout> 

10

Nel mio caso, la classe Binding è stata generata e in posizione (ma pensavo non lo fosse) ... ma non aggiunge automaticamente l'importazione di detta classe alla sezione di importazione di attività / frammenti ... quindi ... OPZIONE + ACCEDERE :)


2
Bingo, ha funzionato per me, anche se ho dovuto digitare manualmente l'importazione, intellisense non offriva l'opzione per qualsiasi motivo.
Rob

8

Dopo averlo configurato correttamente (incluso lo spazio dei nomi xml e avvolgendo tutto <layout>), quello che ha funzionato per me stava facendo Build -> Make project. Né Clean Project né Rebuild Project lo hanno fatto. Sono in Android Studio 2.3.1 e utilizzo gli strumenti di compilazione 26.0.2. Non sono necessari <data>tag.


Questo dovrebbe essere contrassegnato come la risposta corretta. Il resto sono solo soluzioni alternative. Non c'è bisogno di spostare gli spazi dei nomi o anche di aggiungere elementi di dati
Vicky Kapadia

8

se fai un lavoro di base, per abilitare il databainding nel tuo progetto, come usa abilita in gradle e usa il tag layout in xml , quando cambi codice xml e non hai generato una nuova classe di databinding per quegli xml puoi usare un modo veloce per generare solo dati binding class in gradle-> other-> databindinggenbaseclasses Eseguire il debug più velocemente di un intero progetto. genera solo una classe di associazione dati. inserisci qui la descrizione dell'immagine


4
dataBinding {
        enabled = true
    }

Per abilitare il nuovo compilatore di data binding, aggiungi la seguente opzione al tuo file gradle.properties:

android.databinding.enableV2=true

3

Le classi di data binding vengono generate durante la compilazione, quindi dopo aver abilitato il data binding nella build Gradle dell'app e circondato il tuo xml con il tag di layout, dovresti ricostruire la tua app. Se ciò non aiuta, elimina la cartella di build e fallo di nuovo.


2

Grazie a questa risposta qui , sembra che lo "spazio dei nomi del layout" debba essere cancellato o che sia necessario un nuovo nome univoco.

Ecco le opzioni che hanno funzionato per me:

  1. Crea un nuovo nome per il layout per assicurarti che possa essere generato. Questo ha risolto il mio problema, in cui avevo un layout che era stato creato per la prima volta, senza associazione dati - chiamiamolo fragment_abc.xml. Quando ho provato ad aggiungere l'associazione dati ad esso, non è stato riconosciuto, anche dopo più chiamate di cancellazione della cache e riavvio. Tuttavia, non appena ho creato una copia del layout fragment_abc2.xml, ho ottenuto immediatamente l'oggetto .java / .class di associazione dati generato.

  2. Dopo aver visto il lavoro di cui sopra, ho provato a rimuovere semplicemente la cartella / build dal modulo e ho ricostruito il progetto: questo ha funzionato per ottenere l'associazione dei dati per il layout originale.


1

L'unica cosa che posso immaginare, se possibile, è se non ce l'hai

dataBinding {
    enabled true
}

nel tuo file gradle. In caso contrario, aggiungilo al file gradle. cioè

android {
  ......

  dataBinding {
    enabled true
  }
}

quindi sincronizza il tuo progetto. Se il problema persiste, potrebbe essere necessario eseguire l'annullamento / il riavvio del tuo studio Android


Ho chiaramente menzionato nella mia domanda che dopo aver aggiunto <variable>in xml si sta generando la classe Binding, quindi non c'è caso di non aggiungere dataBindingnel file gradle, se non ho aggiunto di quanto non dovrebbe generare la classe di binding.
Ravi

Prima di sincronizzare e riavviare. Prova a "Crea". Si allenerà.
Nizamudeen Sherif

1

Non so che funzionerà per te o no. Basta rinominare il nome del file XML di layout. Ad esempio, supponiamo che il nome del tuo layout sia activity_main.xml cambia semplicemente rinominalo in qualcosa come main.xml e rinominalo nuovamente in activity_main.xml . Quindi puoi vedere l'opzione di importazione su ActivityMainBinding .

Spero che funzioni per te.


1

Quando si lavora con un'applicazione Android multimodulo, controllare il percorso della classe di associazione. Forse dovresti usare:

import com.yourcompany.app.android.modulename.databinding.FragmentABCtBinding invece di:

import com.yourcompany.app.android.databinding.FragmentABCtBinding


1

Elimina i layout e annulla, quindi assicurati che le classi di associazione generate vengano importate correttamente.


0

Ho avuto lo stesso problema. Tutto quello che hai fatto è corretto. Il fatto è che devi aggiungere la variabile all'interno del tag di dati in xml. Per questo dovresti creare una classe modello di esempio e aggiungerla come variabile nel tag di dati.

Fino a quel momento non potrai vedere ActivityMainBinding generato.


0

Ho avuto un problema simile in cui avevo il layout avvolto e il mio data binding abilitato nel file gradle. L'attività principale ancora non poteva intellisense o vedere le mie classi. Ciò che lo ha risolto per me è stato l'aggiunta della variabile di associazione e l'importazione comunque dell'associazione. Da lì ho semplicemente costruito la soluzione e poi mi è sembrato di sapere quale fosse la classe. Da lì sono stato in grado di importare le mie classi di casi di cammello che sono state generate.


0

Ho avuto il problema e il problema era nel layout il campo utilizzato non era una stringa, era una data.

Sembra che tutto il campo debba essere testo per funzionare, almeno con il componente TexView.

Se compili con il comando ./gradlew build --stacktrace

Questo mostra meglio gli errori.


0

Nel mio caso, pensavo che la classe generata dovesse apparire con le mie solite classi nella srccartella. Inoltre, ho pensato che il nome della classe generata dovesse essere leggermente diverso. È stato tutto un mio errore. La classe generata può essere trovata nella buildcartella, build -> generated -> ...percorso. Se non è presente alcuna importazione della classe generata nella tua attività, aggiungi l'importazione

import com.yourcompany.app.databinding.ActivityMainBinding;"

0

Nel caso in cui si ottenga il seguente errore in DataBindingUtil.setContentView

Riferimento non risolto: activity_main

tutto quello che devi fare è rimuovere la seguente istruzione import

importa android.R

Ho trovato la soluzione su un altro forum. fonte


0

Se di recente qualcuno ha migrato un progetto esistente in androidx, è necessario sostituire l'importazione da

import com.yourpackagename.BR;

per

import androidx.databinding.library.baseAdapters.BR;

Dopo Google 2 giorni finalmente ho trovato la soluzione, quale funziona per me.


1
No. Risorsa vincolante ( .BR. ) Come Risorsa ( .R. ). Viene generato in base alla risorsa del progetto (id, drawable, color, ...), quindi verrà inserito nel pacchetto del progetto ( your.project.package.BR). Non all'interno di una libreria di terze parti come androidx.databinding.library.baseAdapters.BR.
orfani il

0

Ci sono casi in cui non vedrai un file nella directory generata, potresti associare una proprietà che non è dichiarata in viewmodel. Essenzialmente non ti dà un errore di lanugine se lo fai in xml.


0

Se stai implementando il Serializable -> devi implementare il Serializable

altrimenti riceverai questo errore. Spero che possa aiutare qualcuno in futuro

Nel mio caso utilizzo la libreria dei pacchi. Non ho annotato @Parcel nella mia sottoclasse


0

Oltre ai passaggi precedenti, puoi anche controllare il tipo di variabile. Assicurati che sia String per TextView o uguale a quello definito in BindingAdapter. Per esempio:

data class MyDataObject(val name: String, val age: Int)

e in XML:

android:text="@{dataobject.age}"

Ciò causerà l'errore precedente. Per risolvere il problema, puoi creare la variabile di età di tipo String oppure importare String nel tuo XML e utilizzare String.valueOf(age)come segue:

<data>
    <import type="String" />
...
</data>

E nel tuo TextView:

android:text="@{String.valueOf(dataobject.age)}"

0

La mia soluzione era prendere come suffisso FragmentBinding nel nome della classe.

Viene generata una classe di associazione per ogni file di layout. Per impostazione predefinita, il nome della classe si basa sul nome del file di layout, convertendolo in case Pascal e aggiungendovi il suffisso Binding. Il nome del file di layout sopra è activity_main.xml, quindi la classe generata corrispondente è ActivityMainBinding. Questa classe contiene tutti i collegamenti dalle proprietà del layout (ad esempio, la variabile utente) alle viste del layout e sa come assegnare i valori per le espressioni di associazione.

La nomenclatura del nome dell'attività o della classe di frammenti può variare in termini di prefissi. Perché il suffisso è sempre vincolante.

Dopo aver seguito la risposta di Khemraj e Invalidate Caches / Restart , dovresti riscrivere ActivityBinding o FragmentBinding per ottenere i suggerimenti IDE delle classi che erano già state generate e NON codificare l'importazione.

Nel mio caso stavo cercando di importare il nome della classe all'indietro FragmentCompetitionsBindinginvece di CompetitionsFragmentBinding.

GL

fonte


0

Nel mio caso, le classi di associazione dati non sono state generate perché avevo eliminato la directory delle risorse Android mipmap. Ho ricreato la directory res / mipmap / e le classi di data binding sono state ripristinate.


0

Ho riscontrato un problema simile in cui DataBinding non è riuscito a generare la classe BindingImpl . Nel mio caso è stato un problema da un metodo nella classe di dati in cui il nome è stato utilizzato in modo sbagliato: il modello conteneva un metodo suSignInCliked () e nel layout ho usato suSigninCliked () . Notare SignIn vs Signin .

Il messaggio di errore non era sufficiente e ho scoperto il problema solo quando ho utilizzato lo script di build con l'opzione stack-trace.


0

Assicurati che il data binding sia abilitato

android {
...
   dataBinding {
        enabled = true
    }
...
}

Sincronizza il progetto con gradle fare clic sul pulsante (Sincronizza progetto con Gradle)


0

Se c'è un problema con il tuo file XML, la classe Databinding no verrà generata. Una soluzione rapida consiste nell'eseguire il file XML e verificare la presenza di errori di sintassi (che di solito sono evidenziati in rosso). Gli errori potrebbero presentarsi sotto forma di riferimenti inesistenti o errati, errori tipografici, ecc.

In sostanza, assicurati solo che non ci sia una linea sottolineata in rosso nel tuo codice XML. Quando hai finito, ricostruisci e la tua classe di associazione dati sarebbe stata generata.


-1

1.Aggiungi sotto nell'app gradle

 dataBinding {
        enabled = true
    }

2.Nel layout xml scrivi sotto il codice

<layout
    xmlns:android="http://schemas.android.com/apk/res/android">
  <data></data>
</layout>if you don't get data binding class just rename the layout file name and you will get data binding class.

3
Perché dataBinding richiederebbe l'autorizzazione a Internet, in un caso generale?
M.Pomeroy

1
@ M.Pomeroy sì non è richiesto, non modificata la risposta grazie
Rohan Lodhi

-5

utilizzare il percorso di classe "com.android.databinding: dataBinder: 1.0-rc0"


per gradle 1.5.0 e versioni successive, non è necessario utilizzare questo classpath.
Ravi
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.