web-dev-qa-db-fra.com

Android Studio ne peut pas générer de classe Binding lors de l'utilisation de DataBinding

  • Android Studio: 3.1.0, 3.1.1
  • Gradle: 4.4
  • Outils de construction: 3.1.0

J'utilise la bibliothèque DataBinding. lorsque j'ajoute un fichier de disposition au projet ou que j'ajoute une vue dans le fichier de disposition, Android Studio ne peut pas générer de classe de liaison pour la disposition, jusqu'à la reconstruction du projet.

fichier de mise en page:

<?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"
    xmlns:tools="http://schemas.Android.com/tools"
    tools:context=".MainActivity">

    <data>

        <variable
            name="viewModel"
            type="com.qk365.thweeks.MainViewModel" />
    </data>

    <RelativeLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent">

        <Android.support.design.widget.TabLayout
            Android:id="@+id/main_tab"
            Android:layout_width="match_parent"
            Android:layout_height="50dp"
            Android:layout_alignParentBottom="true"
            Android:background="@Android:color/white"
            Android:elevation="5dp"
            app:tabGravity="fill"
            app:tabIndicatorHeight="0dp"
            app:tabMode="fixed"
            app:tabSelectedTextColor="#7343ea"
            app:tabTextAppearance="@style/TextAppearance.Design.Tab"
            app:tabTextColor="#181818" />

        <Android.support.v4.view.ViewPager
            Android:id="@+id/main_viewpager"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:layout_above="@id/main_tab">

        </Android.support.v4.view.ViewPager>

    </RelativeLayout>
</layout>

J'ai vérifié Android Journaux Studio, lorsque le fichier de disposition change, il y a toujours un message d'erreur.

2018-04-17 11:20:01,699 [e-1024-b02]  ERROR - .intellij.psi.impl.ElementBase - Element: class com.intellij.psi.impl.source.xml.XmlFileImpl because: different providers: SingleRootFileViewProvider{myVirtualFile=file://E:/AndroidStudioProjects/thweeks/module-order/src/main/res/layout/order_fragment_pick_up_order.xml, content=VirtualFileContent{size=2845}}(5200996b); SingleRootFileViewProvider{myVirtualFile=file://E:/AndroidStudioProjects/thweeks/module-order/src/main/res/layout/order_fragment_pick_up_order.xml, content=VirtualFileContent{size=2845}}(398a3993)
invalidated at: see attachment 
com.intellij.psi.PsiInvalidElementAccessException: Element: class com.intellij.psi.impl.source.xml.XmlFileImpl because: different providers: SingleRootFileViewProvider{myVirtualFile=file://E:/AndroidStudioProjects/thweeks/module-order/src/main/res/layout/order_fragment_pick_up_order.xml, content=VirtualFileContent{size=2845}}(5200996b); SingleRootFileViewProvider{myVirtualFile=file://E:/AndroidStudioProjects/thweeks/module-order/src/main/res/layout/order_fragment_pick_up_order.xml, content=VirtualFileContent{size=2845}}(398a3993)
invalidated at: see attachment
    at com.intellij.psi.util.PsiUtilCore.ensureValid(PsiUtilCore.Java:502)
    at com.intellij.psi.impl.smartPointers.SmartPointerManagerImpl.createSmartPsiElementPointer(SmartPointerManagerImpl.Java:78)
    at com.intellij.psi.impl.smartPointers.SmartPointerManagerImpl.createSmartPsiElementPointer(SmartPointerManagerImpl.Java:69)
    at com.intellij.psi.impl.smartPointers.SmartPointerManagerImpl.createSmartPsiElementPointer(SmartPointerManagerImpl.Java:64)
    at com.intellij.psi.impl.ElementBase$ElementIconRequest.<init>(ElementBase.Java:183)
    at com.intellij.psi.impl.ElementBase$ElementIconRequest.<init>(ElementBase.Java:178)
    at com.intellij.psi.impl.ElementBase.computeIcon(ElementBase.Java:110)
    at com.intellij.psi.impl.ElementBase.getIcon(ElementBase.Java:86)
    at com.intellij.codeInsight.lookup.DefaultLookupItemRenderer._getRawIcon(DefaultLookupItemRenderer.Java:79)
    at com.intellij.codeInsight.lookup.DefaultLookupItemRenderer.getRawIcon(DefaultLookupItemRenderer.Java:48)
    at com.intellij.codeInsight.completion.JavaMethodCallElement.renderElement(JavaMethodCallElement.Java:444)
    at com.intellij.codeInsight.completion.JavaCompletionUtil$4.renderElement(JavaCompletionUtil.Java:468)
    at com.intellij.codeInsight.completion.JavaCompletionUtil$4.renderElement(JavaCompletionUtil.Java:465)
    at com.intellij.codeInsight.lookup.LookupElementDecorator$VisagisteDecorator.renderElement(LookupElementDecorator.Java:179)
    at com.intellij.codeInsight.lookup.LookupElementDecorator.renderElement(LookupElementDecorator.Java:83)
    at com.intellij.codeInsight.lookup.impl.LookupCellRenderer.getListCellRendererComponent(LookupCellRenderer.Java:150)
    at com.intellij.ui.ExpandedItemListCellRendererWrapper.getListCellRendererComponent(ExpandedItemListCellRendererWrapper.Java:38)
    at javax.swing.plaf.basic.BasicListUI.paintCell(BasicListUI.Java:209)
    at com.intellij.ui.components.WideSelectionListUI.paintCell(WideSelectionListUI.Java:56)
    at javax.swing.plaf.basic.BasicListUI.paintImpl(BasicListUI.Java:317)
    at javax.swing.plaf.basic.BasicListUI.Paint(BasicListUI.Java:240)
    at com.intellij.ui.components.WideSelectionListUI.Paint(WideSelectionListUI.Java:32)
    at javax.swing.plaf.ComponentUI.update(ComponentUI.Java:161)
    at javax.swing.JComponent.paintComponent(JComponent.Java:780)
    at com.intellij.ui.components.JBList.paintComponent(JBList.Java:186)
    at javax.swing.JComponent.Paint(JComponent.Java:1056)
    at com.intellij.ui.components.JBList.Paint(JBList.Java:118)
    at javax.swing.JComponent.paintChildren(JComponent.Java:889)
    at javax.swing.JComponent.Paint(JComponent.Java:1065)
    at javax.swing.JViewport.Paint(JViewport.Java:728)
    at com.intellij.ui.components.JBViewport.Paint(JBViewport.Java:236)
    at javax.swing.JComponent.paintChildren(JComponent.Java:889)
    at javax.swing.JComponent.Paint(JComponent.Java:1065)
    at javax.swing.JComponent.paintChildren(JComponent.Java:889)
    at javax.swing.JComponent.Paint(JComponent.Java:1065)
    at javax.swing.JComponent.paintChildren(JComponent.Java:889)
    at javax.swing.JComponent.Paint(JComponent.Java:1065)
    at javax.swing.JLayeredPane.Paint(JLayeredPane.Java:586)
    at javax.swing.JComponent.paintToOffscreen(JComponent.Java:5210)
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.Java:1579)
    at javax.swing.RepaintManager$PaintManager.Paint(RepaintManager.Java:1502)
    at javax.swing.BufferStrategyPaintManager.Paint(BufferStrategyPaintManager.Java:306)
    at javax.swing.RepaintManager.Paint(RepaintManager.Java:1272)
    at javax.swing.JComponent._paintImmediately(JComponent.Java:5158)
    at javax.swing.JComponent.paintImmediately(JComponent.Java:4969)
    at javax.swing.RepaintManager$4.run(RepaintManager.Java:831)
    at javax.swing.RepaintManager$4.run(RepaintManager.Java:814)
    at Java.security.AccessController.doPrivileged(Native Method)
    at Java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.Java:80)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.Java:814)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.Java:789)
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.Java:738)
    at javax.swing.RepaintManager.access$1200(RepaintManager.Java:64)
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.Java:1732)
    at Java.awt.event.InvocationEvent.dispatch(InvocationEvent.Java:311)
    at Java.awt.EventQueue.dispatchEventImpl(EventQueue.Java:762)
    at Java.awt.EventQueue.access$500(EventQueue.Java:98)
    at Java.awt.EventQueue$3.run(EventQueue.Java:715)
    at Java.awt.EventQueue$3.run(EventQueue.Java:709)
    at Java.security.AccessController.doPrivileged(Native Method)
    at Java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.Java:80)
    at Java.awt.EventQueue.dispatchEvent(EventQueue.Java:732)
    at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.Java:822)
    at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.Java:650)
    at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.Java:366)
    at Java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.Java:201)
    at Java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.Java:116)
    at Java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.Java:105)
    at Java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.Java:101)
    at Java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.Java:93)
    at Java.awt.EventDispatchThread.run(EventDispatchThread.Java:82)
2018-04-17 11:20:01,699 [e-1024-b02]  ERROR - .intellij.psi.impl.ElementBase - Android Studio 3.1.1  Build #AI-173.4697961 
2018-04-17 11:20:01,699 [e-1024-b02]  ERROR - .intellij.psi.impl.ElementBase - JDK: 1.8.0_152-release 
2018-04-17 11:20:01,699 [e-1024-b02]  ERROR - .intellij.psi.impl.ElementBase - VM: OpenJDK 64-Bit Server VM 
2018-04-17 11:20:01,699 [e-1024-b02]  ERROR - .intellij.psi.impl.ElementBase - Vendor: JetBrains s.r.o 
2018-04-17 11:20:01,699 [e-1024-b02]  ERROR - .intellij.psi.impl.ElementBase - OS: Windows 10 
2018-04-17 11:20:01,699 [e-1024-b02]  ERROR - .intellij.psi.impl.ElementBase - Last Action: EditorChooseLookupItem 
13
Victor Chiu

J'ai eu le même problème. Peu importe ce que j'ai essayé, il n'a pas pu générer de classe de liaison. L'astuce était que vous deviez renommer votre fichier xml de mise en page. Imaginons que vous ayez un fichier xml my_layout.xml puis renommez-le my_layout_temp.xml. Maintenant, la classe de liaison sera générée avec le nom MyLayoutTempBinding. Si vous n'aimez pas le nom, vous pouvez le renommer en my_layout.xml. À la fin, cela résoudra le problème de génération de classe de liaison.

6
W00di

Remarque: Pour les étapes initiales de débogage, voir la réponse de Khemraj ici - Classe de liaison de données non générée

  • Android Studio: 3.1.4
  • Gradle: 4.4
  • Outils de construction: 28.0.0

Je peux voir les classes de liaison auto-générées momentanément après l'émission d'un

Fichier> Invalider les caches/redémarrer

mais uniquement lorsque l'indexation est suspendue, immédiatement après Android Studio redémarre (je devrais probablement utiliser autre chose que "databinding" pour un nom de projet de test):

enter image description here

enter image description here

En pause, ActivityMain2Binding sera reconnu par le compilateur, cependant les opérations build et make ne sont pas disponibles. Peu de temps après la reprise de l'indexation, les classes de liaison associées sont supprimées et l'erreur IDE mentionnée dans l'OP est enregistrée.

Mise à jour (2018.09.11)

À l'aide d'une astuce trouvée dans le message de bogue commenté ci-dessus ( https://issuetracker.google.com/issues/7760704 ), j'ai modifié le paramètre de liaison de données à

enter image description here

J'ai ensuite ajouté une référence à la classe générée

enter image description here

3
samis

J'ai la même erreur dans le même environnement que vous. Mais malheureusement, je n'ai pas pu résoudre ce problème avec Android Studio 3.1.1. Pour l'instant, j'utilise Android Studio 3.2 Canary11 et cela fonctionne très bien.

0
wakwak3125