2011-11-13 6 views
22

ho creato uno stato-elenco di file di selezione item_bg_selector.xml nella cartella drawable in questo modo:Errore: <item> tag richiede un tag 'disegnabile' attributo o bambino la definizione di un disegnabile

<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> 

Poi Mi definisco un elemento di stile

<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> 

poi cerco di creare un ImageButton come questo:

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

Eclipse continua a darmi il seguente errore nella finestra Event Details:

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

La traccia eccezione è il seguente:

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) 

Ora, la domanda è dove è l'errore? i drawable esistono nella cartella. il tag ha un attributo estraibile. Ho fatto un controllo incrociato per circa 15 volte e ancora non sono stato in grado di trovare il problema. Credo che sia un problema molto semplice (se presente). È apprezzato anche qualsiasi lavoro in giro per superare questo.

Aggiunta: Inoltre, la riga 16 in item_bg_selector.xml corrisponde alla terza riga dall'alto nel file che ho pubblicato. cioè

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

risposta

12

Infine, ho avuto modo di conoscere che è un problema con un solo ADT e in realtà funziona bene sul dispositivo. Ciò corrisponde al numero 21046.

+0

alcuna soluzione alternativa? Nessuno di quelli suggeriti ha funzionato per me. – Matthias

+0

Sembra essere stato corretto in r17; c'è un'anteprima disponibile su tools.android.com. –

2

Ho riscontrato anche lo stesso problema.

Ho appena riavviato eclissi con -clean e ho fatto un project -> Clean sul progetto in questione e gli errori sono andati via.

+0

potrebbe dipendere dal sistema operativo che usiamo anche. Funziona a secco su Mac. – 500865

+0

sì, non funziona in mac –

36

L'errore ha a che fare con il formato del xml, si sta impostando qualcosa come

android:background="@drawable/item_bg_selector" 

Che l'errore sta dicendo è che dovrebbe essere simile a questo

android:drawable="@drawable/item_bg_selector" 
+1

Ho provato così tante cose, passato a intellij anche, quando non funzionava nulla. Questa soluzione mi ha salvato la giornata. Grazie mille. –

+0

Ho provato a cambiare "android: background" in "android: drawable". Non funziona. – Gene

+0

Funziona grazie –

2

Il riavvio di Eclipse e la pulizia del progetto hanno funzionato per me.

18

Ho avuto lo stesso errore e invertire l'ordine degli attributi (come è stato suggerito nella this answer presente other question) per avere drawable primo risolto il problema.

Nel tuo caso sarebbe di commutazione:

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

a:

<item android:drawable="@drawable/item_background_selected" 
    android:state_selected="true" /> 
+0

La tua soluzione ha funzionato! Ma mi chiedo perché così. Stiamo definendo il drawable per lo stato. Non viceversa :) – Ashwin

+0

Anche i [documenti ufficiali] (https://developer.android.com/guide/topics/resources/color-list-resource.html) hanno torto su questo – mr5

0

ho preso a lavorare copiando l'immagine direttamente nel file system (Finder su Mac) piuttosto che attraverso Android Studio.

0

Ho riscontrato il problema perché durante la ridenominazione del selettore per i dispositivi pre-lollipop, ho dimenticato di rinominare il ripple con lo stesso nome anche nella cartella drawable-v21.

0

Lo stesso errore si verifica nel file activity_main.xml se è presente un numero LinearLayout in Activity. La rimozione di questo risolve il problema.

Pulizia e altre cose non aiutano.

2

Ho riscontrato la stessa eccezione per un problema diverso.

Stavo cercando di utilizzare un selettore colore per s' android:background il View:

<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> 

Spostando il selettore per la cartella drawable e cambiando android:color-android:drawable risolto il problema.

Inoltre, la definizione di fondo nel Layout deve essere cambiato in android:background="@drawable/tab_background_selector"

Ecco il selettore finale:

<!-- /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>