web-dev-qa-db-fra.com

Erreur: la balise <item> nécessite un attribut 'drawable' ou une balise enfant définissant un drawable

J'ai créé un fichier de sélecteur de liste d'états item_bg_selector.xml dans le dossier pouvant être dessiné comme ceci:

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
  <item Android:state_selected="true" 
      Android:drawable="@drawable/item_background_selected" />
  <item Android:state_focused="true" 
      Android:drawable="@drawable/item_background_selected" />
  <item Android:state_pressed="true" 
      Android:drawable="@drawable/item_background_selected" />
  <item Android:drawable="@Android:color/transparent"/>
</selector>

Puis je définis un élément de style 

<style name="Item">
    <item name="Android:layout_width">wrap_content</item>
    <item name="Android:layout_height">wrap_content</item>
    <item name="Android:background">@drawable/item_bg_selector</item>
</style>

Ensuite, j'essaie de créer une ImageButton comme ceci:

    <ImageButton style="@style/Item"
        Android:id="@id/btn_home"
    Android:src="@drawable/home_button" />

Eclipse continue à me donner l'erreur suivante dans la fenêtre Event Details

Failed to parse file /path/to/projectdir/res/drawable/item_bg_selector.xml

La trace d'exception est donnée ci-dessous:

org.xmlpull.v1.XmlPullParserException: Binary XML file line #16: <item> tag requires a 'drawable' attribute or child tag defining a drawable
    at Android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.Java:167)
    at Android.graphics.drawable.Drawable.createFromXmlInner(Drawable.Java:787)
    at Android.graphics.drawable.Drawable.createFromXml(Drawable.Java:728)
    at com.Android.layoutlib.bridge.impl.ResourceHelper.getDrawable(ResourceHelper.Java:208)
    at com.Android.layoutlib.bridge.Android.BridgeTypedArray.getDrawable(BridgeTypedArray.Java:731)
    at Android.view.View.<init>(View.Java:1885)
    at Android.widget.ImageView.<init>(ImageView.Java:112)
    at Android.widget.ImageButton.<init>(ImageButton.Java:85)
    at Android.widget.ImageButton.<init>(ImageButton.Java:81)
    at Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at Sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.Java:39)
    at Sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.Java:27)
    at Java.lang.reflect.Constructor.newInstance(Constructor.Java:513)
    at Android.view.LayoutInflater.createView(LayoutInflater.Java:500)
    at com.Android.layoutlib.bridge.Android.BridgeInflater.onCreateView(BridgeInflater.Java:84)
    at Android.view.LayoutInflater.createViewFromTag(LayoutInflater.Java:563)
    at com.Android.layoutlib.bridge.Android.BridgeInflater.createViewFromTag(BridgeInflater.Java:129)
    at Android.view.LayoutInflater.rInflate(LayoutInflater.Java:618)
    at Android.view.LayoutInflater.rInflate(LayoutInflater.Java:621)
    at Android.view.LayoutInflater.inflate(LayoutInflater.Java:407)
    at Android.view.LayoutInflater.inflate(LayoutInflater.Java:296)
    at com.Android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.Java:279)
    at com.Android.layoutlib.bridge.Bridge.createSession(Bridge.Java:318)
    at com.Android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.Java:325)
    at com.Android.ide.Eclipse.adt.internal.editors.layout.gle2.RenderService.createRenderSession(RenderService.Java:372)
    at com.Android.ide.Eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.renderWithBridge(GraphicalEditorPart.Java:1317)
    at com.Android.ide.Eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.recomputeLayout(GraphicalEditorPart.Java:1071)
    at com.Android.ide.Eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.activated(GraphicalEditorPart.Java:897)
    at com.Android.ide.Eclipse.adt.internal.editors.layout.LayoutEditor.pageChange(LayoutEditor.Java:384)
    at org.Eclipse.ui.part.MultiPageEditorPart$2.widgetSelected(MultiPageEditorPart.Java:290)
    at org.Eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.Java:234)
    at org.Eclipse.swt.widgets.EventTable.sendEvent(EventTable.Java:84)
    at org.Eclipse.swt.widgets.Display.sendEvent(Display.Java:3783)
    at org.Eclipse.swt.widgets.Widget.sendEvent(Widget.Java:1375)
    at org.Eclipse.swt.widgets.Widget.sendEvent(Widget.Java:1398)
    at org.Eclipse.swt.widgets.Widget.sendEvent(Widget.Java:1383)
    at org.Eclipse.swt.widgets.Widget.notifyListeners(Widget.Java:1195)
    at org.Eclipse.swt.custom.CTabFolder.setSelection(CTabFolder.Java:2743)
    at org.Eclipse.swt.custom.CTabFolder.onMouse(CTabFolder.Java:1429)
    at org.Eclipse.swt.custom.CTabFolder$1.handleEvent(CTabFolder.Java:257)
    at org.Eclipse.swt.widgets.EventTable.sendEvent(EventTable.Java:84)
    at org.Eclipse.swt.widgets.Display.sendEvent(Display.Java:3783)
    at org.Eclipse.swt.widgets.Widget.sendEvent(Widget.Java:1375)
    at org.Eclipse.swt.widgets.Widget.sendEvent(Widget.Java:1398)
    at org.Eclipse.swt.widgets.Widget.sendEvent(Widget.Java:1383)
    at org.Eclipse.swt.widgets.Widget.notifyListeners(Widget.Java:1195)
    at org.Eclipse.swt.widgets.Display.runDeferredEvents(Display.Java:3629)
    at org.Eclipse.swt.widgets.Display.readAndDispatch(Display.Java:3284)
    at org.Eclipse.ui.internal.Workbench.runEventLoop(Workbench.Java:2640)
    at org.Eclipse.ui.internal.Workbench.runUI(Workbench.Java:2604)
    at org.Eclipse.ui.internal.Workbench.access$4(Workbench.Java:2438)
    at org.Eclipse.ui.internal.Workbench$7.run(Workbench.Java:671)
    at org.Eclipse.core.databinding.observable.Realm.runWithDefault(Realm.Java:332)
    at org.Eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.Java:664)
    at org.Eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.Java:149)
    at org.Eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.Java:115)
    at org.Eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.Java:196)
    at org.Eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.Java:110)
    at org.Eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.Java:79)
    at org.Eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.Java:369)
    at org.Eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.Java:179)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
    at Java.lang.reflect.Method.invoke(Method.Java:597)
    at org.Eclipse.equinox.launcher.Main.invokeFramework(Main.Java:620)
    at org.Eclipse.equinox.launcher.Main.basicRun(Main.Java:575)
    at org.Eclipse.equinox.launcher.Main.run(Main.Java:1408)

Maintenant, la question est où est l'erreur? les tirables existent dans le dossier. La balise a un attribut drawable. J'ai vérifié cela près de 15 fois et je n'ai toujours pas trouvé le problème. Je crois que c'est un problème très simple (le cas échéant). Tout travail pour en finir avec cela est également apprécié.

Addition: De plus, la ligne 16 dans item_bg_selector.xml correspond à la troisième ligne à partir du haut du fichier que j'ai posté. C'est 

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
  <item Android:state_selected="true" 
line16 ----> Android:drawable="@drawable/item_background_selected" />
27
500865

Enfin, je me suis rendu compte que c’était un problème d’ADT et que tout fonctionnait bien sur l’appareil. Cela correspond au numéro 21046 .

12
500865

L’erreur a trait au format de votre fichier xml, vous définissez quelque chose comme 

Android:background="@drawable/item_bg_selector"

Ce que l'erreur vous dit, c'est que ça devrait être comme ça

Android:drawable="@drawable/item_bg_selector"
38
Napsters

J'ai eu la même erreur et changer l'ordre des attributs (comme suggéré dans le cette réponse à ceci autre question ) d'avoir le dessinable le premier résolu le problème.

Dans votre cas, vous changeriez:

  <item Android:state_selected="true" 
   Android:drawable="@drawable/item_background_selected" />

à:

  <item Android:drawable="@drawable/item_background_selected"
   Android:state_selected="true" />
18
pconcepcion

J'ai connu la même exception pour un problème différent.

J'essayais d'utiliser un sélecteur de couleur pour la View 's Android:background:

<RadioButton
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:background="@color/tab_background_selector" />

<!-- /res/color/tab_background_selector.xml -->
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:color="@color/white" Android:state_checked="true" />
    <item Android:color="@color/light_blue" />
</selector>

Déplacer le sélecteur vers le dossier pouvant être dessiné et changer Android:color en Android:drawable a résolu le problème.

De plus, la définition de l’arrière-plan dans la mise en page doit être changée en Android:background="@drawable/tab_background_selector"

Voici le sélecteur final:

<!-- /res/drawable/tab_background_selector.xml -->
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:drawable="@color/white" Android:state_checked="true" />
    <item Android:drawable="@color/light_blue" />
</selector>
6
Oleksandr

Redémarrer Eclipse et nettoyer le projet a fonctionné pour moi.

2
Draghon

J'ai aussi rencontré le même problème. 

Je viens de redémarrer Eclipse avec -clean, et le project -> Clean a été créé sur le projet en question et les erreurs ont disparu.

2
ProfVersaggi

Le dessin dans le fichier (un png) était corrompu. Je viens de sauvegarder à nouveau le fichier et cela a fonctionné.

1
Alberto M

Je l'ai fait fonctionner en copiant l'image directement dans le système de fichiers (Finder sur Mac) plutôt que via Android Studio.

0
craned

La même erreur se produit dans le fichier activity_main.xml s'il existe une variable supplémentaire LinearLayout dans la variable Activity. Supprimer cela résout le problème. 

Nettoyage et autres choses ne aident pas. 

0
Debolabanks

J'ai eu le problème parce que lorsque j'ai renommé le sélecteur d'appareils antérieurs à Lollipop, j'ai oublié de renommer l'ondulation portant le même nom, également dans le dossier drawable-v21.

0
Nino Handler