Drawable选择器不能在Jelly Bean中工作

时间:2012-07-26 01:44:01

标签: android android-layout drawable android-4.2-jelly-bean

我有一个可绘制选择器作为ListView中每个项目的背景,以突出显示所选行。 Eveything在冰淇淋三明治中运作良好,但似乎在果冻豆中不起作用。找不到任何文档说明哪些更改可能导致它停止工作以及我需要做些什么来解决它。

如果不工作,我的意思是当我点击ListView中的一行时,该项目的背景颜色没有转动@color/blue颜色,但是它在ICS中。

这是我正在使用的选择器代码(listing_selector.xml):

<selector xmlns:android="http://schemas.android.com/apk/res/android" >

   <item android:state_focused="true" android:drawable="@color/blue" />

   <item android:state_pressed="true" android:drawable="@color/blue" />

   <item android:state_activated="true" android:drawable="@color/blue_selected" />  

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

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

</selector>

这是ListView项目的布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"  
    android:layout_height="fill_parent" 
    android:orientation="horizontal"
    android:background="@color/listing_selector"    
>

    <TextView 
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true" 
    />

</RelativeLayout>

这是蓝色资源:

<resources>
    <color name="blue">#ff33b5e5</color>       
</resources>

更新1:

尝试将选择器从color文件夹移动到drawable文件夹,并将代码更新为:

android:background="@drawable/listing_selector"

更新2:

此外,在ListView上,尝试添加此内容:

    <ListView android:id="@android:id/list"
        android:layout_width="wrap_content"  
        android:layout_height="fill_parent" 
        android:listSelector="@drawable/listing_selector"   
    />

更新3:

我认为这可能是我的代码中的内容,但我删除了onListItemClick的{​​{1}}中的所有代码,但ListView仍无效。

更新4:

我已将其缩小至selectorstate_selected无效,state_activated似乎正在运作

更新5:

我想我错了。根本不认为选择器被识别。我把内置的state_pressed突出显示混淆为我的选择器。我现在想知道它是否与我的项目设置方式有关。我在库类中有选择器。也许从ICS到JB的情况有所改变,但是将选择器移动到我的应用程序的项目似乎没有解决它。

更新6:

好的,经过多次拔毛后,我再次将其缩小到ListViewstate_selected无法识别,因为更改state_activated的颜色确实有效,这意味着我的选择器被识别。从评论看起来似乎与我的应用程序有关,因为其他人已经能够让选择器与Jelly Bean一起工​​作。

虽然其他有趣的事情是无法识别更改默认状态的state_pressed值。我有drawable的地方,我认为将其更改为颜色会导致列表更改为该颜色,但事实并非如此。

此外,这也不适用于ICS。

更新7:

在更多的头发拉动后,我发现长按菜单项会导致该项目的颜色发生变化。只是点击一个项目仍然无法正常工作。甚至不确定是什么意思。

**最终更新:**

我放弃了,我删除了选择器,只是在点击时刷新color/transparent并记住点击的位置并从代码中突出显示它。不理想,但不值得尝试修复。

5 个答案:

答案 0 :(得分:2)

好吧,我认为你的选择器存在问题。尝试删除state_focused和state_activated。您可以为选择器尝试此操作:

<!-- Disabled State -->
<item
    android:state_enabled = "false"
    android:state_focused = "true"
    android:state_pressed = "true"
    android:drawable="@android:color/transparent">
</item>
<item
    android:state_enabled = "false"
    android:state_focused = "true"
    android:drawable="@android:color/transparent">
</item>

<!-- Pressed State -->
<item
    android:state_pressed = "true"
    android:state_focused = "true">
    <shape>
        <solid android:color="@color/blue"/>
    </shape>
</item>
<item
    android:state_pressed = "true"
    android:state_focused = "false">
    <shape>
        <solid android:color="@color/blue"/>
    </shape>
</item>

<!-- Normal State -->
<item
    android:drawable="@android:color/transparent">
</item>

我发现我也需要使用形状对象而不是android:drawable,因为在ICS之前的手机上,整个列表将突出显示该颜色而不是按下的列表项。

您也可以添加state_selected代码,但我不确定如何使用它。查看果冻豆的默认选择器代码,了解它们使用的状态:list_selector_background.xml

答案 1 :(得分:1)

listing_selector.xml必须位于res/drawable文件夹中,并设置RelativeLayout的android:background属性,如下所示:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"  
    android:layout_height="fill_parent" 
    android:orientation="horizontal"
    android:background="@drawable/listing_selector"    
>

答案 2 :(得分:1)

我无法说出它在一个版本中工作而在另一个版本中工作的原因,但我得到了另一种解决方案。

将您的颜色定义为资源中的可绘制

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <drawable name="blue">#00F</drawable>
    ...
</resources>

在选择器中使用此颜色可绘制

<?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/blue" />
    ...
    ...
</selector>

试试这个并告诉我。

答案 3 :(得分:0)

我认为它运作良好!!

你的选择器xml文件代码: -

<?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">

        <item android:drawable="@color/gray" android:state_focused="true"/>
        <item android:drawable="@color/gray" android:state_pressed="true"/>
        <item android:drawable="@color/orange" android:state_activated="true"/>
        <item android:drawable="@color/orange" android:state_selected="true"/>
        <item android:drawable="@color/orange"/>

    </selector>

现在在res文件夹下创建一个文件夹值-v16,并将此颜色文件放入其中。

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <color name="gray">#4f4f4f</color>
    <color name="orange">#e26c0e</color>

</resources>

然后是listview:

<ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginTop="20dp"
        android:listSelector="@drawable/listing_selector" >
</ListView>

希望这有效!在4.1版本上测试

答案 4 :(得分:0)

来自API Docs

  

注意:请记住,Android 会应用州列表中的第一项   匹配对象的当前状态。所以,如果是第一项   该列表不包含上面的任何状态属性,那么它就是   每次都应用,这就是为什么你的默认值应该是   最后(如以下示例所示)。

因此,请尝试根据建议的顺序重新排序选择器的状态。在你的情况下,这将是:

<selector xmlns:android="http://schemas.android.com/apk/res/android" >
   <item android:state_pressed="true" android:drawable="@color/blue" />
   <item android:state_focused="true" android:drawable="@color/blue" />
   <item android:state_selected="true" android:drawable="@color/blue_selected" />
   <item android:state_activated="true" android:drawable="@color/blue_selected" />  
   <item android:drawable="@android:color/transparent" />
</selector>