[android] 사용자 지정 선택기를 통한 ListView 항목 배경

목록 선택기를 통해 각 Listview 항목에 사용자 지정 배경을 적용 할 수 있습니까?

기본 선택기 @android:color/transparentstate_focused="false"케이스에 대해 지정 하지만이를 일부 사용자 정의 드로어 블로 변경해도 선택되지 않은 항목에는 영향을주지 않습니다. Romain Guy는 이 답변 에서 이것이 가능하다고 제안하는 것 같습니다 .

저는 현재 각 뷰에서 사용자 정의 배경을 사용하고 항목이 선택 / 초점 / 어떤 것이 든 선택기가 표시 될 때 숨기는 방식으로 동일한 효과를 얻고 있지만,이 모든 것을 한 곳에서 정의하는 것이 더 우아 할 것입니다.

참고로, 이것은 내가이 작업을 시도하고 얻는 데 사용하는 선택기입니다.

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

    <item android:state_focused="false"
        android:drawable="@drawable/list_item_gradient" />

    <!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
    <item android:state_focused="true" android:state_enabled="false"
        android:state_pressed="true"
        android:drawable="@drawable/list_selector_background_disabled" />
    <item android:state_focused="true" android:state_enabled="false"
        android:drawable="@drawable/list_selector_background_disabled" />

    <item android:state_focused="true" android:state_pressed="true"
        android:drawable="@drawable/list_selector_background_transition" />
    <item android:state_focused="false" android:state_pressed="true"
        android:drawable="@drawable/list_selector_background_transition" />

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

</selector>

그리고 이것이 내가 선택기를 설정하는 방법입니다.

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

도움을 주셔서 미리 감사드립니다!



답변

나는 이것 때문에 좌절했고 마침내 그것을 해결했습니다. Romain Guy가 암시했듯이 "android:state_selected"사용해야하는 다른 상태 가 있습니다. 목록 항목의 배경에 상태 드로어 블을 사용하고 목록에 대해 다른 상태 드로어 블을 사용 listSelector합니다.

list_row_layout.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:background="@drawable/listitem_background"
    >
...
</LinearLayout>

listitem_background.xml :

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:drawable="@color/android:transparent" />
    <item android:drawable="@drawable/listitem_normal" />
</selector>

ListView를 포함하는 layout.xml :

...
<ListView 
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:listSelector="@drawable/listitem_selector"
   />
...

listitem_selector.xml :

<?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/listitem_pressed" />
    <item android:state_focused="true" android:drawable="@drawable/listitem_selected" />
</selector>


답변

패딩을 배경으로 사용하는 9 패치 드로어 블이있는 경우 dglmtn의 솔루션이 작동하지 않습니다. 이상한 일이 일어나고, 나는 그것에 대해 이야기하고 싶지도 않습니다. 그런 문제가 있으면 알고 있습니다.

이제 다른 상태와 9- 패치 드로어 블 (모든 드로어 블 및 색상과 함께 작동 할 것임)이있는 목록보기를 원한다면 두 가지 작업을 수행해야합니다.

  1. 목록의 항목에 대한 선택기를 설정합니다.
  2. 목록의 기본 선택기를 제거하십시오.

해야 할 일은 먼저 row_selector.xml을 설정하는 것입니다.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_enabled="true" 
     android:state_pressed="true" android:drawable="@drawable/list_item_bg_pressed" />
    <item android:state_enabled="true"
     android:state_focused="true" android:drawable="@drawable/list_item_bg_focused" />
    <item android:state_enabled="true"
     android:state_selected="true" android:drawable="@drawable/list_item_bg_focused" />
    <item
     android:drawable="@drawable/list_item_bg_normal" />
</selector>

잊지 마세요 android:state_selected. android:state_focused목록에서 와 같이 작동 하지만 목록 항목에 적용됩니다.

이제 항목 (row.xml)에 선택기를 적용합니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@drawable/row_selector"
>
...
</RelativeLayout>

목록에 대한 투명한 선택기를 만듭니다.

<ListView
    android:id="@+id/android:list"
    ...
    android:listSelector="@android:color/transparent"
    />

이것은 일을해야합니다.


답변

목록보기 행에 “배경색”을 사용하지 마십시오.

이것은 모든 선택기 작업을 차단합니다 (내 문제였습니다!)

행운을 빕니다!


답변

Android 개발자 블로그의 “내 목록이 검은 색인 이유는 무엇입니까? Android 최적화” 기사 에는 스크롤 할 때 목록 배경이 검은 색으로 변하는 이유에 대한 자세한 설명이 있습니다. 간단한 대답 : 목록의 cacheColorHint를 투명 (# 00000000)으로 설정합니다.


답변

다음을 넣으면 충분합니다 list_row_layout.xml.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:background="@drawable/listitem_background">... </LinearLayout>

listitem_selector.xml :

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/dark" android:state_pressed="true" />
    <item android:drawable="@color/dark" android:state_focused="true" />
    <item android:drawable="@android:color/white" />
</selector>


답변

대신에:

android:drawable="@color/transparent" 

쓰다

android:drawable="@android:color/transparent"


답변

테마를 작성할 수 있습니다.

<pre>

    android:name=".List10" android:theme="@style/Theme"

theme.xml

<style name="Theme" parent="android:Theme">
        <item name="android:listViewStyle">@style/MyListView</item>
</style>

styles.xml

 <style name="MyListView" parent="@android:style/Widget.ListView">
<item name="android:listSelector">@drawable/my_selector</item>

my_selector는 사용자 지정 선택기를 원합니다. 죄송합니다. 코드 작성 방법을 모르겠습니다.