selectableItemBackground

selectableItemBackground

我将9patch设置为布局的背景。但是,我仍然想通过使用selectableItemBackground attr提供触摸反馈。

我试过使用带有9patch的<layer-list>selectableItemBackground作为第二个android:drawable<item>,但是没有用。

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

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

最佳答案



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

但是,您可以在代码中检索属性的主题和特定于平台的可绘制对象:

// 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"

10-07 22:46