?android:attr / selectableItemBackground与另一个现有背景

时间:2013-11-28 15:34:30

标签: android nine-patch android-selector

我将9patch设置为布局的背景。但是,我仍然希望使用selectableItemBackground attr。

提供触摸反馈

我尝试将<layer-list>与9patch一起使用,selectableItemBackground作为第二个android:drawable的{​​{1}},但这不起作用。

我还可以尝试制作一个选择器,并使用<item>覆盖selectableItemBackground list_selector_background_pressed.xml<layer-list>的渐变可绘制机器人用途。但是在4.4 KitKat中,所选的背景颜色在JellyBeans中实际上是灰色而不是蓝色,所以我无法对其进行硬编码:(

必须有一种更简单的方法,对吧? d:

1 个答案:

答案 0 :(得分:16)

  

我尝试过使用9patch和   selectableItemBackground作为android:第二个drawable,   但这没效果。

是的,图层列表(或状态列表)中的drawable属性不接受attr值。你会看到Resource.NotFoundException。查看LayerDrawable(或StateListDrawable)的源代码可以解释原因:您提供的值假定为drawable的id。

但是,您可以在代码中检索属性的主题和特定于平台的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);

您还需要设置yourLayoutContainer's clickable属性:

android:clickable="true"