我正在尝试为onClick()
中的每一行设置TableLayout
突出显示。
我有一个可绘制的资源文件:
<item
android:drawable="?android:attr/selectableItemBackground"
android:state_focused="true"
android:state_pressed="true" />
<!-- Bottom border -->
<item android:top="65dp" android:left="15dp">
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<size android:height="0.25dp"/>
<solid android:color="@color/dark_blue"/>
</shape>
</item>
我在三星Galaxy S5设备上进行了测试。 但是,当我在安装了Android 4.4.2的中兴Compel设备上进行测试时,它无效。
我的应用程序的目标是API 15及更高版本。
任何想法为什么:?android:attr/selectableItemBackground
在Android 4.4.2设备上不起作用?
日志错误:
引起:org.xmlpull.v1.XmlPullParserException:二进制XML文件行#7:标记需要一个'drawable'属性或定义drawable的子标记
我有?attr/selectableItemBackground
但它无法解决问题。
我做了大量的研究。
您方提出的任何其他建议吗?
答案 0 :(得分:0)
问题出在我的可绘制资源文件中,我正在使用图层列表。
列表(或状态列表)中的可绘制属性不接受attr值。但是,我无法在布局文件中设置此attr值,因为我还需要每个表格行的底部边框。
所以要修复它,在Java类文件中:
我在onCreate()方法中检索对每一行的引用。
实施例:
TableRow row1 = (TableRow)findViewById(R.id.table_row_1);
然后我创建了一个方法来处理将属性添加到bottom_border可绘制文件中:
`void setRowHighlight(TableRow row) {
// 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();
if (Build.VERSION.SDK_INT < 16) {
LayerDrawable ld = new LayerDrawable(new Drawable[] {
// Table Rows Border Drawable
getResources().getDrawable(R.drawable.table_rows_border),
// Drawable from attribute
d });
// Set the background to 'ld'
row.setBackgroundDrawable(ld);
} else {
LayerDrawable ld = new LayerDrawable(new Drawable[] {
// Table Rows Border Drawable
ResourcesCompat.getDrawable(getResources(), R.drawable.table_rows_border, null),
// Drawable from attribute
d });
// Set the background to 'ld'
row.setBackground(ld);
}
}`
启用行突出显示,在onCreate()中调用我的方法:
setRowHighlight(row1);
我已经在我的三星Galaxy S5设备(Android 5.0)和中兴通讯Compel设备(Android 4.4.2)上进行了测试,它可以正常运行。
参考:?android:attr/selectableItemBackground with another existing background