2012-04-05 24 views
9

Tengo un diseño con dos fragmentos. El fragmento de la mano izquierda es un ListFragment que utiliza un SimpleCursorAdaptor; el lado derecho se rellena con detalles sobre el elemento seleccionado de la lista en el fragmento de la izquierda. Estoy tratando de averiguar cómo asegurarse de que el elemento seleccionado de ListFragment se mantenga resaltado hasta que se seleccione otro elemento en la lista.¿Mantener resaltado para el elemento seleccionado en fragmento?

Después de algunas investigaciones llegué a intentar usar android:background="@drawable/item_selector" Puedo cambiar los colores para los diferentes estados, pero ninguno de ellos parece persistir. Pensé que seleccionaría ... parece lógico que el artículo seleccionado siga siendo el elemento seleccionado hasta que seleccione uno diferente.

Incluso intenté usar v.setSelected(true); en mi manipulador de clics esperando que pudiera mantener el estado, pero tampoco funcionó.

¿Hay un estado que me falta? Miré a través de los documentos dev y nada más parecía apropiado ...

item_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="@color/green" /> 
    <item 
     android:state_selected="true" 
     android:drawable="@color/blue" /> 
</selector> 

No estoy seguro de lo que podría ayudar a otro código, por lo que no dude en pedir cualquier otra cosa que podría pensar que es necesario.

+0

Sé el primero es antiguo, pero ¿el selector no necesita un elemento que no tenga calificadores en el caso de que ninguno pueda coincidir? – Mgamerz

Respuesta

12

La respuesta estaba en la documentación de Android después de más investigaciones (realmente dos partes de la documentación).

Primero, en el modo táctil no hay un estado seleccionado o enfocado.

En segundo lugar, de forma predeterminada, las vistas de listas están configuradas en un modo de elección de ninguno (lo que significa que ningún elemento de la lista puede tener un estado elegido). Todo lo que tenía que hacer era cambiar el modo de elección (que podría ser únicos o múltiples, que sólo necesitaba/quería individual) mediante la adición de esto:

getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

Luego usé el estado opción en mi XML selector (se traduce en la activated estado):

<item 
android:state_activated="true" 
android:drawable="@color/blue" /> 

Aplicar que en el archivo xml diseño fila que el fondo:

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    android:layout_width="match_parent" 
    android:layout_height="35dp" 
    android:background="@drawable/item_selector" 
    android:gravity="center_vertical"/> 

Mi tema elegido ahora aparece con un fondo azul hasta que un elemento diferente i s elegido.

Tenga en cuenta que esto (android: state_activated) requiere Android API 11 o posterior.

+2

android: state_activated necesita al menos nivel de API 11 – eftokay83

+3

no funciona para mí. – Shine

+0

funcionó para mí! –

1

Creo que necesita agregar state_focused para que se sienta seleccionado o resaltado.

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

    <item 
     android:state_focused="true" 
     android:drawable="@color/red" /> 
</selector> 
+1

Gracias por la sugerencia. Lo intenté, pero todavía no tuve suerte. :( – Barak

0

Esto funcionó muy bien para mí en el ListFragment, pero creo que funciona solo para Android 4.0 y superiores. Creé un diseño simple para el elemento de la lista con android:background="?android:attr/activatedBackgroundIndicator (en el caso de Android por debajo de 4).0 que necesita para ceate el similar en dibujables):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="?android:attr/listPreferredItemHeight" 
android:gravity="center_vertical" 
android:background="?android:attr/activatedBackgroundIndicator" 
android:orientation="horizontal" > 

<TextView 
    android:id="@+id/list_item_text" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:ellipsize="end" 
    android:singleLine="true" 
    android:textAppearance="?android:attr/textAppearanceListItemSmall" 
    android:gravity="center_vertical" 
    android:layout_margin="@dimen/double_view_margin" /> 

Y entonces, crear un simple ArrayAdapter el uso de esta disposición y establecer el modo de elegir a una sola:

final ArrayAdapter<String> labelsAdapter = new ArrayAdapter<String>(getActivity(), R.layout.item_simple_list_item, R.id.list_item_text, labels); 

setListAdapter(labelsAdapter); 

getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

Después que se puede resaltar el elemento necesario con setItemChecked método:

@Override 
public void onListItemClick(final ListView l, final View v, final int position, final long id) { 
    getListView().setItemChecked(position, true); 
} 
Cuestiones relacionadas