2012-09-12 8 views
6

Tengo un ListView, y funciona muy bien en un teléfono. Ahora estoy haciendo una interfaz de usuario de tableta, con ListView a la izquierda y detalles a la derecha.Android: mantener el fondo azul después de la selección ListView

Cuando toco un elemento, parpadea en azul mientras está presionado. Quiero mantener ese color azul hasta que se seleccione otro elemento, al igual que la aplicación de Gmail en el Nexus 7.

¿Cuál es la forma más limpia de lograr eso? Prefiero evitar establecer fondos manualmente, supongo que hay una manera de marcar un elemento como el "activo" y el tema en consecuencia.

+0

Se puede ver este enlace puede ayudar: http://stackoverflow.com/questions/5682053/listview-item-wont-stay-selected –

+0

Puede establecer el color de fondo de la vista del elemento listview en el clic del elemento listview. –

Respuesta

17

¿Cuál es la forma más limpia de lograr eso?

Lo que está buscando se conoce como el estado "activado". Para que esto funcione:

Paso n. ° 1: En res/values-v11/, tenga un recurso de estilo que implemente activated. Por ejemplo, para un nuevo proyecto que tiene la declaración AppTheme definido allí, ir con algo como:

<resources> 

    <style name="AppTheme" parent="android:Theme.Holo.Light"></style> 

    <style name="activated" parent="AppTheme"> 
     <item name="android:background">?android:attr/activatedBackgroundIndicator</item> 
    </style> 

</resources> 

Paso # 2: Definir el mismo estilo en res/values/ para cualquier dispositivos más antiguos, al igual que un recurso de estilo talón, por lo referencias a ella siguen trabajando:

<resources> 

    <style name="AppTheme" parent="android:Theme.Light"/> 

    <style name="activated" parent="AppTheme"/> 

</resources> 

Paso # 3: en su recurso XML diseño de la fila de la ListView, añaden style="@style/activated" a la lista de atributos del elemento raíz

St EP # 4: Establecer el ListView ser una lista única opción, como la siguiente línea en un ListFragment:

getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

Esto se puede ver en acción en this sample project, this sample project y this sample project. Para obtener más antecedentes sobre esos dos primeros ejemplos, vea esta cuestión de forma: Complete Working Sample of the Gmail Three-Fragment Animation Scenario?

+0

Funciona de maravilla, y de hecho es mucho mejor que seguir cambiando el fondo mediante programación. ¡Muchas gracias! – erwan

4

Usando

android.R.layout.simple_list_item_activated_1

en lugar de

R.layout.simple_list_item_checkable_1.

Solo para alguien que esté revisando algún día.

2

después de días de buscar y tirar de mi cabello, descubrí que activatedBackgroundIndicator también está disponible en el sistema de estilo ActionBarSherlock. La mayoría de los desarrolladores que desarrollan aplicaciones compatibles con versiones anteriores utilizan ActionBarSherlock, por lo que usar ActionBarSherlock es una buena opción para la mayoría de los casos. Así que en lugar de utilizar android:background="?android:attr/activatedBackgroundIndicator" que dará errores en las versiones de Android antes del 11, sólo tiene que utilizar: android:background="?activatedBackgroundIndicator"

aquí es el código de diseño xml ejemplo consecutivas:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
    //note the activatedBackgroundIndicator 
android:background="?activatedBackgroundIndicator" 
android:minHeight="?android:attr/listPreferredItemHeight" 
android:paddingBottom="2dip" 
android:paddingTop="2dip" > 

<TextView 
    android:id="@+id/text1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:gravity="center_vertical" 
    android:minHeight="?android:attr/listPreferredItemHeight" 
    android:paddingLeft="6dip" 
    android:paddingRight="6dip" 
    android:textSize="15sp" /> 

<TextView 
    android:id="@+id/text2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:gravity="center_vertical" 
    android:minHeight="?android:attr/listPreferredItemHeight" 
    android:paddingRight="5dip" 
    android:textSize="20dip" /> 
    </LinearLayout> 
+0

'Entonces, en lugar de usar android: background ="? ActivatedBackgroundIndicator "que dará errores en las versiones de Android anteriores a 11, simplemente use: android: background ="? ActivatedBackgroundIndicator "' ¿Qué? Puede usted explicar esto? – kuchi

+0

Gracias 4pointing.Corrected the answer. –

Cuestiones relacionadas