2013-11-28 13 views
7

Ho un set di 9 caratteri come sfondo del mio layout. Tuttavia, desidero comunque fornire un feedback sul tocco utilizzando lo strumento selectableItemBackground attr.? Android: attr/selectableItemBackground con un altro sfondo esistente

Ho provato con un <layer-list> con la 9patch e selectableItemBackground come android:drawable del secondo <item>, tuttavia, che non ha funzionato.

Potrei anche provare a fare un selettore e sovrapporre il gradiente drawable Android utilizza per selectableItemBackground in list_selector_background_pressed.xml con un <layer-list>. Ma in 4.4 KitKat il colore di sfondo selezionato è in realtà grigio invece che blu in jellybeans, quindi non posso davvero hardcode è :(

Ci deve essere un modo più semplice, vero ragazzi D:?

risposta

16

ho provato con un con l'9patch e selectableItemBackground come l'androide: drawable del secondo, tuttavia, che non ha funzionato

Sì, attributo drawable in uno strato-list (o stato-list) fa. non accetta un valore attr. Vedresti un Resource.NotFoundException. Uno sguardo al codice sorgente di LayerDrawable (o StateListDrawable) spiega perché: si presume che il valore fornito sia l'id di un disegnabile.

Ma, è possibile recuperare un tema e disegnabile specifico per la piattaforma per un attributo in codice:

// Attribute array 
int[] attrs = new int[] { android.R.attr.selectableItemBackground }; 

TypedArray a = getTheme().obtainStyledAttributes(attrs); 

// Drawable held by attribute 'selectableItemBackground' is at index '0'   
Drawable d = a.getDrawable(0); 

a.recycle(); 

Ora, è possibile creare un LayerDrawable:

LayerDrawable ld = new LayerDrawable(new Drawable[] { 

         // Nine Path Drawable 
         getResources().getDrawable(R.drawable.Your_Nine_Path), 

         // Drawable from attribute 
         d }); 

// Set the background to 'ld' 
yourLayoutContainer.setBackground(ld); 

Avrete anche bisogno di set yourLayoutContainer's clickable attributo:

android:clickable="true" 
+0

Questo sembra interessante. Proverò. –

+0

@JasonHu Spiacente, non ho esaminato completamente il tuo commento, ero al telefono. Se hai una domanda, vai avanti. – Vikram

+0

Incredibile. Funziona come un fascino. Inizialmente pensavo di dover creare un selettore per gli stati selezionati (9patch solo su default e LayerDrawable quando selezionato). Ma sembra che il drawable torni dal selectableItemBackground è in realtà il selettore stesso. Grazie. –