ListSelector适用于整个列表

jax*_*jax 47 android

我有一个简单的列表,其中包含listselector.

<ListView android:id="@+id/list" android:layout_width="fill_parent"
    android:layout_height="fill_parent" android:layout_below="@+id/round"
    android:listSelector="#99000000" android:clickable="true" android:cacheColorHint="#00000000" android:background="#00000000">
</ListView>
Run Code Online (Sandbox Code Playgroud)

如您所见,android:listSelector ="#99000000",但"黑色alpha"颜色应用于整个列表,而不是所选项目.


所以这就是我现在所拥有的,但整个列表仍然变黑

:: listview_background.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_enabled="false" android:state_focused="true"
        android:drawable="@drawable/list_normal" />
  <item android:state_pressed="true"
        android:drawable="@drawable/list_pressed" />
  <item android:state_focused="true"
        android:drawable="@drawable/list_active" />
</selector>
Run Code Online (Sandbox Code Playgroud)

:: colors.xml

<resources>
    <drawable name="list_normal">#96FFFFFF</drawable>
    <drawable name="list_active">#66000000</drawable>
    <drawable name="list_pressed">#CA000000</drawable>
</resources>
Run Code Online (Sandbox Code Playgroud)

::我列表中的xml标记

android:listSelector="@drawable/listview_background"
Run Code Online (Sandbox Code Playgroud)

Pil*_*_51 89

我遇到了同样的问题,在查看平台可绘制的XML文件之一时,我注意到了一种方法,通过在XML中创建形状,无需为颜色创建图像文件.

例如,而不是:

<item android:state_focused="true"
      android:drawable="@drawable/list_active" />
Run Code Online (Sandbox Code Playgroud)

做:

<item android:state_focused="true">
    <shape>
        <solid android:color="#66000000" />
    </shape>
</item>
Run Code Online (Sandbox Code Playgroud)

除了创建简单的彩色绘图外,形状也很灵活,类似于简单的矢量对象.所有细节都可以在这里找到:http://developer.android.com/guide/topics/resources/drawable-resource.html#Shape

  • 是!谢谢你,我见过的唯一答案实际上解决了所述的问题而没有解决它. (3认同)
  • 我不知道如何使用十六进制颜色值将不同问题的解决方案转换为变通方​​法,但如链接文档中所述,您也可以使用颜色资源.`<solid android:color ="@ color/list_active"/>` (2认同)

Eri*_*ric 28

我有同样的问题.我有一个自定义背景图像,我不想制作该背景图像的变体,因为代表所有不同的状态将是乏味的.

所以我想做一件显而易见的事情,有一个半透明的条形覆盖在聚焦的列表项目的顶部,当用户点击"输入"键或其他任何东西时,它闪烁到按下的叠加颜色,这更加引人注目更不透明.

解决方案是远离任何引用listSelector内部颜色的@color或@drawable.我创建了两个3x3像素.png文件.每个都保存有伽玛层.在我的情况下,它是两个相同的颜色,每个颜色在Gimp中混合,颜色层上具有不同的透明度.因此,当您选择一个项目时,您会得到一个25%颜色的叠加层,当您按下它时,您会得到一个50%颜色的png.我将它们放在我的drawable中作为bg_list_item_pressed.png和bg_list_item_highlighted.png

然后我将列表选择器设置为:

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

  <!-- Selected --> 
  <item 
    android:state_focused="true" 
    android:state_pressed="false" 
    android:drawable="@drawable/bg_list_item_highlighted" /> <!--  @drawable/tab_focus -->

  <!-- Pressed -->
  <item 
    android:state_pressed="true" 
    android:drawable="@drawable/bg_list_item_pressed" /> <!--  @drawable/tab_press -->

</selector> 
Run Code Online (Sandbox Code Playgroud)

然后我将我的listSelector属性添加到我的布局xml中的ListView:

android:listSelector="@drawable/list_selector"
android:drawSelectorOnTop="true"
Run Code Online (Sandbox Code Playgroud)

现在它正是我希望它工作的方式.包括使用D-pad选择一行,然后按Enter键单击它.获得突出显示和随后按下颜色的确切方式.

  • 问题仍然存在:为什么我们不能将ColorDrawable用于单个状态?创建一个3px图像来表示颜色只是一种解决方法,而不是一个合适的解决方案. (5认同)

wor*_*ked 17

如果要为列表中的每个项目设置行布局,我就是这样做的.请注意设置为listSelector的透明值.(为简洁起见,我删除了colors.xml.)

main.xml中

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
  <ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:listSelector="#00000000"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

row.xml

<FrameLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/row"
  android:layout_width="fill_parent"
  android:layout_height="?android:attr/listPreferredItemHeight"
  android:background="@drawable/list_selector">
  ...
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)

list_selector.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="#66FFFFFF" />
    <item android:drawable="#FF666666"/> 
</selector>
Run Code Online (Sandbox Code Playgroud)

  • 这应该是可接受的答案,因为它不依赖于某些"变通方法像素". (2认同)