Android中的setSelected()和state_selected是什么意思?

14

我在使用View.setSelected()时遇到了麻烦。例如,TextViews更改其字体颜色,但我的背景选择器似乎无法注册更改。

示例选择器:

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

我甚至不确定哪种上下文信息会有用。这些视图是 LinearLayout 的子级,我在触摸事件中以编程方式设置选定状态。正如我所说,它似乎有效,因为字体颜色从白色变成灰色,但背景仍然相同。

编辑:在发布之前我检查了愚蠢的错误:P。答案不是"添加 android:background 属性"。


我不知道选择器XML中项目的顺序是否重要,但无论我在哪里看到它, 默认项目总是在项目列表底部。 - Ron
您,先生,是一个天才。显然,它尝试按顺序匹配状态。请编写答案,以便我可以接受它! - salezica
3个回答

34

在选择器XML文件中,项目的顺序很重要,而默认项应始终位于项目列表底部。


1
天啊,我为这个问题奋斗了一两个小时。谢谢你,你给了我巨大的帮助。 - Jessie A. Morris
1
谢谢,我也为这个问题奋斗了相当长的时间... 这太荒谬了。 - Lukas1

8

不仅选定状态的顺序重要,所有状态的顺序也很重要。在我的情况下,我将state_pressed放在第一位,导致我的state_selected无法工作。所以我按照以下方式改变了顺序,然后它就正常工作了:

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

编辑

我现在遇到的问题是,当我按下按钮时,它会处于选中状态而不是按下状态。因此,解决方案是按照以下顺序设置状态,并且额外地,添加默认按钮外观是一个好习惯:



首先,设置选定状态,然后交替将其设置为按下状态。(目前,stackoverflow无法完全显示我的编辑,不知道为什么,请耐心等待)。


0

不太清楚为什么,但我认为这可能有效(请注意添加了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>

希望这有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接