Perché lo stato pressato di un colorstatelist funziona con un elemento di listview?
-
21-12-2019 - |
Domanda
Sto cercando di impostare un ListView
con elementi che hanno diversi colori di sfondo, quindi il metodo getView()
del mio adattatore chiama setBackgroundResource()
con una risorsa disegnabile appropriata per il colore di sfondo desiderato.
Se utilizzo un ColorDrawable
che fa riferimento a un ColorStateList
come il suo colore, il colore per lo stato pressato dal ColorStateList
non viene disegnato quando tocca l'elemento.
Se utilizzo un StateListDrawable
che fa riferimento a un ColorDrawable
per lo stato pressato e un diverso ColorDrawable
per lo stato non frequente, ottengo l'effetto di evidenziazione desiderato quando tocca l'elemento.
Ho creato un semplice progetto per dimostrarlo. Ecco il metodo getView()
dal ListAdapter
:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View retval = getLayoutInflater().inflate(android.R.layout.simple_list_item_1, parent, false);
TextView textView = (TextView)retval.findViewById(android.R.id.text1);
textView.setText("" + position);
switch ( position ) {
case 0:
retval.setBackgroundResource(R.drawable.list_background_item_0);
break;
case 1:
retval.setBackgroundResource(R.drawable.list_background_item_1);
break;
}
return retval;
}
.
Res / Disegable / List_background_item_0.xml:
<color xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/list_background_item_0" />
.
res / colore / lista_background_item_0.xml:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:color="@color/list_background_item_0_pressed"/>
<item android:color="@color/list_background_item_0_default"/>
</selector>
.
Res / Disegable / List_background_item_1.xml:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/list_background_item_1_pressed" />
<item android:drawable="@drawable/list_background_item_1_default" />
</selector>
.
RES / Diseggi / List_background_ITEM_1_DEFAULT.XML:
<color xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/list_background_item_1_default" />
.
RES / Diseggi / List_Background_ITEM_1_press.xml:
<color xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/list_background_item_1_pressed" />
.
res / valori / colori.xml:
<resources>
<color name="list_background_item_0_default">#FFCCCC</color>
<color name="list_background_item_0_pressed">#996666</color>
<color name="list_background_item_1_default">#CCFFCC</color>
<color name="list_background_item_1_pressed">#669966</color>
</resources>
.
Elemento dell'elenco 0 è configurato con un ColorDrawable
che fa riferimento a ColorStateList
e non visualizza un evidenziatore quando premuto. Elenco Articolo 1 è configurato con un StateListDrawable
e visualizza l'evidenziazione.
Preferirei piuttosto utilizzare il ColorStateList
del StateListDrawable
in quanto sembra più pulito e coinvolge un file in meno per tipo di oggetto. C'è qualcosa che ho perso che mi ha permesso di usare questo metodo? Se non è destinato a funzionare come mi aspetto, qualcuno può spiegare perché?
Soluzione
Grazie a LUKSPROG Commento, ho imparato che i disegni a cui riferimento dal StateListDrawable
possono essere colori da colors.xml
. Questo rende la soluzione StateListDrawable
preferibile alla versione ColorStateList
.
La soluzione finale è ...
Metodo getView()
:
- .
-
Nessuna modifica
res / colore / lista_background_item_0.xml:
- .
- cancellato
Res / Disegable / List_background_item_0.xml:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@color/list_background_item_0_pressed" />
<item android:drawable="@color/list_background_item_0_default" />
</selector>
.
Res / Disegable / List_background_item_1.xml:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@color/list_background_item_1_pressed" />
<item android:drawable="@color/list_background_item_1_default" />
</selector>
.
RES / Diseggi / List_background_ITEM_1_DEFAULT.XML:
- .
- cancellato
RES / Diseggi / List_Background_ITEM_1_press.xml:
- .
- cancellato
res / valori / colori.xml:
- .
-
Nessuna modifica
Questa soluzione è pulita o più pulita di quanto mi aspettassi che la versione ColorStateList
abbia funzionato.