salezica
salezica

Reputation: 76949

Android, setSelected() and state_selected

I'm having trouble with View.setSelected(). Views are flagged as selected -- TextViews, for example, change their font color -- but my background selectors don't seem to register the change.

Example selector:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/transparent" />

    <item android:state_selected="true">
        <shape android:shape="rectangle">
            <solid android:color="#ff8600" />
        </shape>
    </item>
</selector>

I'm not even sure which kind of context information would be useful. The views are children of a LinearLayout, and I'm programatically setting the selected state inside a touch event. As I said, it does seem to work, since the font color goes from white to gray, but the background stays the same.

Edit: I checked for silly mistakes before posting :P. The answer is not "add the android:background attribute".

Upvotes: 14

Views: 28899

Answers (3)

Opiatefuchs
Opiatefuchs

Reputation: 9870

not only the selected state order is important, even the order of all states is important. In my case, I added state_pressed as first and my state_selected doesn´t work. So I changed the order like this, and then it worked:

<selector xmlns:android="http://schemas.android.com/apk/res/android" >
  <item 
    android:state_selected="false"
    android:drawable="@drawable/chooser_normal"></item>
<item 
    android:state_selected="true"
    android:drawable="@drawable/chooser_pressed"></item>
<item 
    android:state_pressed="true"
    android:drawable="@drawable/chooser_pressed"></item>
<item 
    android:state_pressed="false"
    android:drawable="@drawable/chooser_normal"></item>
 </selector>

EDIT

I faced now also the problem, if I press the button, it will be in the selected-state but not in pressed-state. So, the solution must be, to order the states like this and additional, it´s a good practise to add a default button look:



First, set the selected state and after this, set the same as pressed state alternately. (For now, stackoverflow isn´t showing my edit completely, don´t know why, just be patient please).

Upvotes: 8

Ron
Ron

Reputation: 24235

The order of items matters in selector xmls, the default item should always be at the bottom in the items list.

Upvotes: 34

Phillip Fitzsimmons
Phillip Fitzsimmons

Reputation: 2945

It's not obvious why, but I think this might work (notice the addition of state_selected="false"):

<item android:state_selected="false" android:drawable="@android:color/transparent" />

<item android:state_selected="true">
    <shape android:shape="rectangle">
        <solid android:color="#ff8600" />
    </shape>
</item>

I hope that's helpful.

Upvotes: 0

Related Questions