Android Drawable选择器在Jelly Bean中不起作用
我有一个可绘制的选择器作为Android Drawable选择器在Jelly Bean中不起作用,android,android-layout,drawable,android-4.2-jelly-bean,Android,Android Layout,Drawable,Android 4.2 Jelly Bean,我有一个可绘制的选择器作为列表视图中每个项目的背景,以突出显示所选行。在冰淇淋三明治里,一切都很好,但在果冻豆里似乎不起作用。找不到任何文档说明哪些更改可能导致它停止工作,以及我需要做什么来修复它 “不工作”是指当我单击列表视图中的一行时,项目的背景色不会变为@color/blue颜色,但在ICS中会变为蓝色 这是我正在使用的选择器代码(清单_selector.xml): 这是蓝色资源: <resources> <color name="blue">#ff33b5
列表视图中每个项目的背景,以突出显示所选行。在冰淇淋三明治里,一切都很好,但在果冻豆里似乎不起作用。找不到任何文档说明哪些更改可能导致它停止工作,以及我需要做什么来修复它
“不工作”是指当我单击列表视图中的一行时,项目的背景色不会变为@color/blue
颜色,但在ICS中会变为蓝色
这是我正在使用的选择器代码(清单_selector.xml):
这是蓝色资源:
<resources>
<color name="blue">#ff33b5e5</color>
</resources>
更新2:
另外,在列表视图上尝试添加以下内容:
<ListView android:id="@android:id/list"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:listSelector="@drawable/listing_selector"
/>
更新3:
我想这可能是我的代码中的某个内容,但我从列表视图的onListItemClick
中删除了所有代码,而且选择器仍然不起作用
更新4:
我已经把它缩小到state\u selected
或state\u activated
不工作,而state\u pressed
似乎正在工作
更新5:
我想我错了。我认为选择器根本没有被识别。我混淆了内置的ListView
突出显示作为我的选择器。我现在想知道这是否与我的项目设置方式有关。我在库类中有选择器。从ICS到JB,可能发生了一些变化,但是将选择器移动到我的应用程序的项目似乎并没有修复它
更新6:
好的,在进一步拉扯头发之后,我再次将其缩小到state\u selected
或state\u activated
不被识别,因为更改state\u pressed
的颜色确实有效,这意味着我的选择器被识别。从中的评论来看,这似乎与我的应用程序有关,因为其他人已经能够让选择器使用Jelly Bean
尽管另一件有趣的事情是,无法识别更改默认状态的drawable
值。如果我有color/transparent
,我会认为将其更改为一种颜色会导致列表更改为该颜色,但事实并非如此
而且,这在ICS中也不起作用
更新7:
在做了更多的头发拉扯之后,我发现长时间按菜单项会导致菜单项的颜色发生变化。仅仅点击一个项目仍然不起作用。甚至不知道这是什么意思
**最后更新:**
我放弃了,我删除了选择器,只是在单击时刷新列表视图
,记住单击的位置并从代码中突出显示它。不理想,但不值得尝试修复。listing\u 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"
>
我说不出它在一个版本中工作而在另一个版本中不工作的原因,但我找到了另一种解决方案
在资源中将颜色定义为可绘制颜色
<?xml version="1.0" encoding="utf-8"?>
<resources>
<drawable name="blue">#00F</drawable>
...
</resources>
#00F
...
在选择器中使用此颜色可绘制
<?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>
...
...
试试这个,让我知道。好的,我认为这是您的选择器的问题。请尝试删除“聚焦”状态和“激活”状态。您可以为选择器尝试以下操作:
<!-- 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>
我发现我也需要使用shape对象,而不是android:drawable
,因为在ICS之前的手机上,整个列表将突出显示该颜色,而不是按下的列表项
您也可以添加所选的状态
代码,但我不确定如何使用它。查看jelly bean的默认选择器代码,查看它们所使用的状态:。我认为它工作正常
选择器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>
#4F4F
#e26c0e
然后是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版上测试,来自:
注意:记住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>
将listing\u selector.xml
移动到res/drawable
文件夹,但仍然不起作用。@KrisB K\u Anas强调了这一行:@drawable/listing\u selector
@SherifelKhatib不确定你的意思。我将listing_selector.xml
移动到res/drawable
,并将该行代码从android:background=“@color/listing_selector”
更改为android:background=“@drawable/listing_selector”
。我还遗漏了什么吗?@KrisB嗯,我以为你遗漏了那句话(因为你的评论)。你能试着删除这一行并将listSelector添加到你的ListView吗?@SherifelKhatib yep,也试过了,娜达。我将更新我的OP,使其更加清晰。当您尝试更新2时,是否从列表项中删除了android:background。我对列表使用android:listSelector,然后没有为列表项定义android:background;一切都适合我。另外,我不确定它是否相关,但我也有android:cacheColorHint=“@null”。@Chris Yea,尝试过也没有用。我添加了一个新的更新(#5)。我想知道这个问题是不是
<?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>
<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>