2016-03-09 23 views
14

Mentre si utilizza l'associazione dati, io non sono in grado di ottenere classe MainActivityBinding secondo Data Binding Guidenon può risolvere Android classe associazione dati

Il mio nome layout è activity_main.xml. Anche io vedo Android - DataBinding - How and when the Binding classes will be generated? ma non può aiutarmi.

+0

Qual è il nome della tua attività ?? –

+0

@MD Il mio nome actvity è: 'MainActivity.java' – pRaNaY

+2

Il progetto Clean and Built genererà di nuovo classe DataBinding come @RRR ha detto –

risposta

11

Grazie a tutti per la risposta. Ho trovato una soluzione con il nome della classe ContentMainBinding per l'associazione dei dati. Lasciami spiegare.

NOTA: Mentre si utilizza il layout con <include ... qui è <include layout="@layout/content_main" avendo Data Binding funzionalità, il nome della classe relativa a includere il nome del layout. Ecco l'ContentMainBinding

mio file di layout sono le seguenti:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:context="com.databindingdemo.app.MainActivity"> 
    ... 
    <include layout="@layout/content_main" /> 
    ... 
    </android.support.design.widget.CoordinatorLayout> 

E content_main.xml è layout in cui ho aggiunto il mio codice del layout dei dati Binding.

Così, invece di utilizzare MainActivityBinding Può risolta con ContentMainBinding

Il codice che lavoro per me è al di sotto:

//Code for data binding 
    ContentMainBinding contentMainBinding = DataBindingUtil.setContentView(this, R.layout.content_main); 
    user = new User("Pranay", "Patel", "[email protected]", "9999999999"); 
    contentMainBinding.setUser(user); 

FATTO.

45

La classe DataBinding verrà generata in base al nome del file xml. È chiaramente menzionato nel documento che stai seguendo.

Per impostazione predefinita, verrà generata una classe Binding in base al nome del file di layout, convertendolo in caso Pascal e aggiungendo il suffisso "Binding". Il file di layout di cui sopra era main_activity.xml quindi la classe generare era MainActivityBinding

Se il tuo nome XML è activity_main.xml di DataBinding nome della classe sarà ActivityMainBinding.

Se il nome xml è main_activity.xml, il nome della classe DataBinding sarà MainActivityBinding.

Non dimenticate di pulire e costruire progetti una volta

potete seguire questo tutorial per di più su DataBinding

+0

Sono sicuro che con il nome del layout come ho già aggiunto nella mia domanda. – pRaNaY

+0

sì ma in questione hai menzionato 'activity_main.xml' e usando' MainActivityBinding', dovrebbe essere 'ActivityMainBinding' – Rocky

+0

Assicurati di ricostruire il progetto dopo aver aggiunto i componenti xml, in modo che questa classe sia generata. –

1

Non posso commentare quindi mi limiterò a aggiungi a in risposta. Credo che activity_main.xml creerà ActivityMainBinding piuttosto che MainActivityBinding come hai detto. in alcuni casi in cui studio non riesce a trovare la classe di binding, basta invalidare le cache e ricostruire il progetto.

1

Per impostazione predefinita, una classe Binding viene generata in base al nome del file di layout, avviandolo in maiuscolo, rimuovendo i caratteri di sottolineatura (_) e capitalizzando la lettera successiva e quindi "Binding".

Questa classe verrà inserita in un pacchetto di associazione dati sotto il pacchetto di moduli.

Ad esempio, il file di layout contact_item.xml genererà ContactItemBinding.

Se il pacchetto del modulo è com.example.my.app, verrà inserito in com.example.my.app.databinding.

Le classi di binding possono essere rinominate o inserite in pacchetti diversi regolando l'attributo di classe dell'elemento di dati. Ad esempio:

<data class="ContactItem"> 
    ... 
</data> 

Questo genera la classe vincolante ContactItem nel pacchetto associazione dati nel pacchetto modulo. Se la classe dovrebbe essere generato in un pacchetto differente all'interno del pacchetto modulo, può essere preceduto da “.”:

<data class=".ContactItem"> 
    ... 
</data> 

In questo caso, ContactItem è generato nel pacchetto modulo direttamente. Ogni pacchetto può essere utilizzato se viene fornito il pacchetto completo:

<data class="com.example.ContactItem"> 
    ... 
</data> 
3

Se DataBinding nome della classe è corretto e usato per pulire e ricostruire progetto, ma si mostrano ancora l'errore.
quindi si tenta di riavviare Android Studio

1

Verificare che l'attività/xml e la classe del frammento ha nomi coerenti; ad esempio, se hai TimePickerFragment di nome file xml dovrebbe essere time_picker_fragment.

Mi è venuto in mente che avevo il layout denominato fragment_time_picker; dopo averlo cambiato, è stata generata l'associazione.

2

In questi casi, se non funzionano né rigenerano né invalidano le cache, è necessario che ci sia un errore in uno dei file xml in cui è stato possibile utilizzare @ {xyz.abc} e deve esserci un problema con xyz o abc nel xml.

0

Ho provato le seguenti soluzioni che non hanno funzionato per me: 1) Invalidare la cache e riavviare. 2) Riavvia Android Studio. 3) Ricostruisci progetto.

Che cosa ha fatto risolvere il problema è: 1. Rimozione del tag "DataBinding" nel modulo gradle.build 2. Sync progetto 3 Ritorna di nuovo il 4. Progetto Sync tag "associazione dati".

Problemi correlati