2013-11-28 7 views
7

Ich habe eine 9patch als Hintergrund für mein Layout festgelegt. Allerdings möchte ich immer noch Berührungsfeedback mit dem selectableItemBackground attr.? Android: attr/selectableItemBackground mit einem anderen vorhandenen Hintergrund

Ich habe versucht, eine <layer-list> mit dem 9patch und selectableItemBackground als android:drawable des zweiten <item> verwenden, aber das hat nicht funktioniert.

Ich könnte auch versuchen, einen Wähler zu machen und die Steigung ziehbar Android Anwendungen für selectableItemBackground in list_selector_background_pressed.xml mit einem <layer-list> überlagern. Aber in 4.4 KitKat die ausgewählte Hintergrundfarbe grau ist tatsächlich statt blau in Jellybeans, so kann ich nicht wirklich hart codieren es :(

Es muss sein, ein einfacher Weg, direkt Jungs D:

Antwort

16

ich habe versucht, ein mit dem 9patch und selectableItemBackground als android mit: ziehbar des zweiten, aber das hat nicht funktioniert

Ja, ziehbar Attribut in einer Schicht-Liste (oder state-Liste) der Fall ist. Akzeptieren Sie keinen Wert attr. Sie würden einesehen. Ein Blick auf den Quellcode von LayerDrawable (oder StateListDrawable) erklärt warum: Der von Ihnen angegebene Wert wird als ID eines Zeichenzeichens angenommen.

Aber können Sie ein Thema und plattformspezifische ziehbar für ein Attribut in Code abzurufen:

// 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(); 

Jetzt können Sie erstellen 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); 

Sie müssen auch auf set yourLayoutContainer's clickable Attribut:

android:clickable="true" 
+0

Das sieht interessant aus. Werde versuchen. –

+0

@JasonHu Sorry, ich habe deinen Kommentar nicht vollständig durchgegangen, war auf Anruf. Wenn du eine Frage hast, mach weiter. – Vikram

+0

Erstaunlich. Klappt wunderbar. Ich dachte zuerst, ich müsste einen Selektor für die ausgewählten Zustände machen (9patch nur auf Standard und das LayerDrawable wenn ausgewählt). Aber es scheint, dass das Zeichen, das Sie aus dem selectableItemBackground zurückholen, tatsächlich der Selektor selbst ist. Vielen Dank. –