android - steinmeier - Mostrando la selección actual en una lista
alemania wikipedia (4)
Como se ve en la versión para tableta de gmail y google talk, estoy tratando de mostrar la selección actual en una vista de lista. Sé que esto no es una práctica estándar y debe evitarse cuando sea necesario. En mi programa, la vista de lista siempre está en la pantalla y el elemento seleccionado muestra un nuevo fragmento a la derecha (similar a Gmail y Google Talk).
Para evitar que el usuario adivine qué elemento ha sido seleccionado, me gustaría mostrar la selección actual. Intenté crear un selector, pero después de hacer clic se vuelve al fondo normal.
¿Cómo puedo conseguir esto?
este es mi selector xml
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@drawable/list_item_bg2" android:state_pressed="false" android:state_selected="false"
android:state_focused="false"/>
<item android:drawable="@drawable/list_item_selected_bg2" android:state_pressed="true"/>
<item android:drawable="@drawable/list_item_selected_bg2" android:state_pressed="false" android:state_focused="false"
android:state_selected="true" android:state_checked="false"/>
<item android:drawable="@drawable/list_item_selected_bg2" android:state_pressed="false" android:state_focused="true"
android:state_selected="false"/>
<item android:drawable="@drawable/list_item_selected_bg2" android:state_pressed="false" android:state_focused="false"
android:state_selected="false" android:state_checked="true"/>
<item android:drawable="@drawable/list_item_selected_bg2" android:state_pressed="true" android:state_focused="true"
android:state_selected="true" android:state_checked="true"/>
<item android:drawable="@drawable/list_item_selected_bg2" android:state_pressed="true"/>
</selector>
Lo que Gmail y aplicaciones similares usan es el estado activated
, con un diseño de fila apropiado. Ver:
- Configuración de la barra de menú de fondo y persistencia de Android: el uso de un atributo en versiones anteriores provoca un bloqueo - ¿Hay un enfoque de tema / patrón?
- Cambiar el color del fondo del elemento de la lista activada en Honeycomb
En pocas palabras, usted:
- Utilice un diseño de fila con un fondo activado (por ejemplo,
android.R.layout.simple_list_item_activated_1
) - Use
setChoiceMode(ListView.CHOICE_MODE_SINGLE)
en suListView
- "Verifique" la fila que debe activarse usando
setItemChecked()
en suListView
para habilitar el estado "activado" y tener el resaltado persistente
Lo que funcionó para mí
anula el estilo ListView global en su tema
<item name="android:listViewStyle">@style/MyListView</item>
define tu estilo
<style name="MyListView" parent="@android:style/Widget.ListView"> <item name="android:listSelector">@drawable/listview_background_selector</item> </style>
define el selector listview_background_selector.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" android:enterFadeDuration="@android:integer/config_mediumAnimTime" android:exitFadeDuration="@android:integer/config_mediumAnimTime"> <item android:drawable="@color/ListViewBackGroundColorPressed" android:state_activated="true" /> </selector>
establece el fondo de tu lista vista-elemento-diseño
android:background="?android:attr/activatedBackgroundIndicator"
Si usa un diseño personalizado para cada fila:
- crea un selector con android: state_activated = "true"
- aplícalo como fondo del diseño personalizado.
un ejemplo del selector dibujable:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:exitFadeDuration="@android:integer/config_shortAnimTime">
<item android:state_activated="true" android:drawable="@color/android_green" />
<item android:drawable="@android:color/transparent" />
</selector>
Su otra opción es establecer el fondo de su elemento de lista personalizado en android: background = "? Android: attr / activatedBackgroundIndicator"