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

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

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

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

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

Ответ 1

Я пробовал использовать с 9patch и selectableItemBackground как андроид: можно сделать второй, однако это не сработало.

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

Но вы можете получить тему и платформу, подходящую для атрибута в коде:

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

Вам также потребуется установить атрибут yourLayoutContainer clickable:

android:clickable="true"