13

我有一个可绘制选择器作为 a 中每个项目的背景,ListView以突出显示所选行。Eveything 在 Ice Cream Sandwich 中运行良好,但在 Jelly Bean 中似乎不起作用。找不到任何文档说明哪些更改可能导致它停止工作以及我需要做些什么来修复它。

通过不工作,我的意思是当我单击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仍然ListView无法selector正常工作。

更新 4:

我已经把它缩小到state_selectedstate_activated不工作,state_pressed似乎工作

更新 5:

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

更新 6:

好的,在拉了一些头发之后,我再次将其缩小到要么 被识别,state_selected要么state_activated不被识别,因为改变颜色state_pressed确实有效,这意味着我的选择器正在被识别。从评论看来,我的应用程序似乎有些特殊,因为其他人已经能够让选择器与 Jelly Bean 一起工作。

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

此外,这在 ICS 中也不起作用。

更新 7:

在拉了更多头发之后,我发现长按菜单项会导致该项目的颜色发生变化。仅单击一个项目仍然不起作用。甚至不确定是什么意思。

**最终更新:**

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

4

5 回答 5

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

于 2012-09-19T19:21:39.487 回答
1

listing_selector.xml必须在res/drawable文件夹中并android:background像这样设置RelativeLayout的属性:

<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"    
>
于 2012-07-26T02:27:25.980 回答
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>

试试这个,让我知道。

于 2012-09-19T10:13:08.540 回答
1

API 文档

注意:请记住,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>
于 2012-09-21T19:27:32.457 回答
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 文件夹下创建一个文件夹 values-v16 并将此颜色文件放入其中。

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

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

</resources>

然后是列表视图:

<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 版本上测试

于 2012-09-20T12:19:44.680 回答