背景
我制作了以下 ImageView,以支持选择器为“src”:
public class CheckableImageView extends ImageView implements Checkable {
private boolean mChecked;
private static final int[] CHECKED_STATE_SET = { android.R.attr.state_checked };
public CheckableImageView(final Context context, final AttributeSet attrs) {
super(context, attrs);
final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.com_app_CheckableImageView, 0, 0);
setChecked(a.getBoolean(R.styleable.com_app_CheckableImageView_com_app_checked, false));
a.recycle();
}
@Override
public int[] onCreateDrawableState(final int extraSpace) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
if (isChecked())
mergeDrawableStates(drawableState, CHECKED_STATE_SET);
return drawableState;
}
@Override
public void toggle() {
setChecked(!mChecked);
}
@Override
public boolean isChecked() {
return mChecked;
}
public interface OnCheckStateListener {
void onCheckStateChanged(boolean checked);
}
private OnCheckStateListener mOnCheckStateListener;
public void setOnCheckStateListener(OnCheckStateListener onCheckStateListener) {
mOnCheckStateListener = onCheckStateListener;
}
@Override
public void setChecked(final boolean checked) {
if (mChecked == checked)
return;
mChecked = checked;
refreshDrawableState();
if (mOnCheckStateListener != null)
mOnCheckStateListener.onCheckStateChanged(checked);
}
}
问题
上面的代码适用于普通选择器,这些选择器将图像文件作为每个状态的可绘制项目。
问题是,它根本不适用于矢量可绘制对象(使用“srcCompat”)。相反,它显示一个空的内容。
这是我尝试过的:
<...CheckableImageView
...
app:srcCompat="@drawable/selector"/>
选择器(例如)是:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:drawable="@drawable/test"/>
<item android:state_pressed="true" android:drawable="@drawable/test" />
<item android:drawable="@drawable/test2" />
</selector>
示例矢量可绘制:
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="48dp"
android:height="48dp"
android:viewportWidth="48"
android:viewportHeight="48">
<path
android:fillColor="#0000ff"
android:strokeColor="#000000"
android:pathData="M 0 0 H 48 V 48 H 0 V 0 Z" />
<path
android:fillColor="#ff0000"
android:strokeColor="#000000"
android:pathData="M14.769224,32.692291l5.707315,-17.692275l3.073244,17.479182l6.585245,-16.413424l2.634209,16.200186l-4.170761,-8.526356l-5.048693,7.247362l-5.268419,-8.100027l-3.51214,9.805351z" />
</vector>
问题
为什么它不起作用?我做的有什么问题?我该如何解决?