?android: attr / selectableItemBackground с другим существующим фоном

у меня есть набор 9patch в качестве фона моего макета. Однако я все еще хочу обеспечить обратную связь касания, используя selectableItemBackground attr.

Я пробовал использовать <layer-list> С 9patch и selectableItemBackground Как android:drawable второй <item>, однако это не сработало.

я мог бы также попробовать сделать селектор и наложить градиент drawable android использует для selectableItemBackground на list_selector_background_pressed.xml С <layer-list>. Но в 4.4 KitKat выбранный цвет фона на самом деле серый, а не синий в JellyBeans, поэтому я не могу его жестко закодировать: (

должен быть более простой способ, верно, ребята? Д:

1 ответов


Я пробовал использовать a с 9patch и selectableItemBackground в качестве android:drawable второго , однако это не сработало.

да, атрибут drawable в списке слоев (или списке состояний) не принимает attr значение. Вы увидите Resource.NotFoundException. Взгляд на исходный код LayerDrawable (или StateListDrawable) объясняет, почему: значение, которое вы предоставляете, считается идентификатором drawable.

но, вы можете получить тему и специфичный для платформы drawable для атрибута в коде:

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

теперь, вы можете создать 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);

Вам также нужно установить :

android:clickable="true"