Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android LinearLayout with color resource: What am I doing wrong?

I followed this tutorial to create a color state list for a particular Android view. I just want it to highlight when clicked so the user knows why the screen just changed.

When the view is rendered, I get the following error:

org.xmlpull.v1.XmlPullParserException: Binary XML file line #3: tag requires a 'drawable' attribute or child tag defining a drawable

My color XML (in res/color/viewcolor.xml):

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android">     <item android:state_pressed="true" android:color="#ff33ffff"/> <!-- pressed -->     <item android:color="#ff000000"/> <!-- default --> </selector> 

My layout XML (in res/layout/myview.xml):

<?xml version="1.0" encoding="utf-8"?> <LinearLayout      xmlns:android="http://schemas.android.com/apk/res/android"         android:id="@+id/myview"     android:orientation="horizontal"     android:layout_width="fill_parent"     android:layout_height="wrap_content"     android:gravity="top"     android:background="@color/viewcolor">     <!--crap in the layout--> </LinearLayout> 

What did I miss?

like image 238
iandisme Avatar asked Aug 17 '10 19:08

iandisme


People also ask

Which is better LinearLayout or RelativeLayout?

Relativelayout is more effective than Linearlayout. From here: It is a common misconception that using the basic layout structures leads to the most efficient layouts. However, each widget and layout you add to your application requires initialization, layout, and drawing.

What is the difference between LinearLayout and RelativeLayout in Android?

Android Layout TypesLinearLayout : is a ViewGroup that aligns all children in a single direction, vertically or horizontally. RelativeLayout : is a ViewGroup that displays child views in relative positions. AbsoluteLayout : allows us to specify the exact location of the child views and widgets.

What is LinearLayout in Android with example?

LinearLayout is a view group that aligns all children in a single direction, vertically or horizontally. You can specify the layout direction with the android:orientation attribute. Note: For better performance and tooling support, you should instead build your layout with ConstraintLayout.


2 Answers

I remember that I worked around this error by using state drawable instead of state color. For some reason layout background just doesn't work with stateful colors. So try creating a stateful drawable (for example list of shape drawables with different colors) and use it as background.

res/drawable/pressed.xml:

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >    <solid android:color="#ff33ffff" />  </shape> 

res/drawable/normal.xml:

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >    <solid android:color="#ff000000" />  </shape> 

res/drawable/background.xml:

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android">     <item android:state_pressed="true" android:drawable="@drawable/pressed" />     <item android:drawable="@drawable/normal" /> </selector> 

Then use background.xml drawable as background :)

like image 132
Konstantin Burov Avatar answered Sep 20 '22 19:09

Konstantin Burov


Instead of using shapes in your drawable, you can use the android:drawable attribute which accepts a color resource (e.g. @color/black).

layout.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout      xmlns:android="http://schemas.android.com/apk/res/android"     android:id="@+id/myview"     android:orientation="horizontal"     android:layout_width="fill_parent"     android:layout_height="wrap_content"     android:gravity="top"     android:background="@drawable/myDrawable">     <!-- other views in layout--> </LinearLayout> 

my_drawable.xml

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android">     <!-- focused -->     <item android:state_focused="true" android:drawable="@color/YOUR_COLOR_HERE" />     <!-- focused and pressed-->     <item android:state_focused="true" android:state_pressed="true" android:drawable="@color/YOUR_COLOR_HERE" />     <!-- pressed -->     <item android:state_pressed="true" android:drawable="@color/YOUR_COLOR_HERE" />     <!-- default -->     <item android:drawable="@color/YOUR_COLOR_HERE" />  </selector> 

In my_drawable.xml you need to make sure that the colors you specify are defined in res/values/colors.xml, or this won't work.

If you want to use an image instead of a color change from a color resource to a drawable resource. Example:

android:drawable="@color/YOUR_COLOR_HERE" android:drawable="@drawable/YOUR_IMAGE_HERE" 
like image 25
Austyn Mahoney Avatar answered Sep 20 '22 19:09

Austyn Mahoney