500865
500865

Reputation: 7120

Error : <item> tag requires a 'drawable' attribute or child tag defining a drawable

I created a state-list selector file item_bg_selector.xml in the drawable folder like this :

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

Then i define a style element

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

Then I try to create an ImageButton like this :

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

Eclipse keeps giving me the following error in the Event Details window :

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

The exception trace is given below :

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)

Now, The question is where is the error? the drawables exist in the folder. tag has a drawable attribute. I have cross checked this close to 15 times and still I have not been able to find the problem. I believe it is a very simple problem(if any). Any work around to get over with this is also appreciated.

Addition : Also, line 16 in item_bg_selector.xml corresponds to the third line from the top in the file I have posted. that is

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

Upvotes: 55

Views: 61012

Answers (12)

fazal ur Rehman
fazal ur Rehman

Reputation: 404

         In my case I was applying color attribute to checkedIcon attribute, Instead 
         of chipIconTint, so replacing checkedIcon with chipIconTint in style solved 
         my problem.
           Use   
          <item name="chipIconTint">@color/chip_text_color</item>
           Instead of
          <item name="checkedIcon">@color/chip_text_color</item>

Upvotes: 0

Eric
Eric

Reputation: 17536

similar to this answer, I need to make a drawable version of the color resource.

solution

  1. instead of modifying the existing color state list file, craete a new drawable file

    new_drawable_file.xml

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android">
        <solid android:color="@color/old_color_state_list" />
    </shape>
    
  2. then i updated the problematic usages of @color/old_color_state_list to @drawable/new_drawable_file.

background

  • in my styles.xml, i had overridden ?android:activatedBackgroundIndicator with my @color/old_color_state_list
    <item name="android:activatedBackgroundIndicator">@color/old_color_state_list</item>
    
  • but the documentation for ?android:activatedBackgroundIndicator says it should be a drawable resource, not a color:

    Drawable used as a background for activated items.

  • so, i updated my styles.xml to override ?android:activatedBackgroundIndicator with my @drawable/new_drawable_file drawable, instead.
    <item name="android:activatedBackgroundIndicator">@drawable/new_drawable_file</item>
    

Upvotes: 7

Alberto M
Alberto M

Reputation: 1760

The drawable inside the file (a png) was corrupted. I just saved again the file and it worked.

Upvotes: 1

Oleksandr
Oleksandr

Reputation: 6356

I've experienced the same Exception for a different problem.

I was trying to use a color selector for the 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>

Moving the selector to the drawable folder and changing android:color to android:drawable solved the problem.

Also, the background definition in the Layout needs to be changed to android:background="@drawable/tab_background_selector"

Here is the final selector:

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

Upvotes: 47

Debolabanks
Debolabanks

Reputation: 11

The same error occurs on the activity_main.xml file if there is an extra LinearLayout in the Activity. Removing this solves the issue.

Cleaning and other things do not help.

Upvotes: 1

luckyhandler
luckyhandler

Reputation: 11329

I had the problem because when renaming the selector for pre-lollipop devices, I forgot to rename the ripple with th e same name also in the drawable-v21 folder.

Upvotes: 0

craned
craned

Reputation: 3051

I got it to work by copying the image right into the file system (Finder on Mac) rather than through Android Studio.

Upvotes: 0

pconcepcion
pconcepcion

Reputation: 5641

I had the same error and switching the order of the attributes (as it was suggested in the this answer to this other question) to have the drawable the first one solved the problem.

In your case would be switching:

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

to:

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

Upvotes: 20

Draghon
Draghon

Reputation: 367

Restarting Eclipse and cleaning the project worked for me.

Upvotes: 1

Napsters
Napsters

Reputation: 657

The error has to do with the format of your xml, you are setting something like

android:background="@drawable/item_bg_selector"

What the error is telling you is that it should be like this

android:drawable="@drawable/item_bg_selector"

Upvotes: 49

ProfVersaggi
ProfVersaggi

Reputation: 886

I also encountered the same issue.

I just restarted eclipse with -clean, and the did a project -> Clean on the project in question and the errors have gone away.

Upvotes: 1

500865
500865

Reputation: 7120

Finally, I got to know that its a problem with just ADT and it actually runs fine on the device. This corresponds to issue 21046.

Upvotes: 14

Related Questions