バックグラウンド
セレクターを "src" としてサポートするために、次の ImageView を作成しました。
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>
質問
うまくいかないのはなぜですか?私がしたことの何が悪いのですか?どうすれば修正できますか?