我已经制作了以下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>
示例矢量drawable:
<?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>
为什么它不起作用?我做了什么错了?我该如何解决?
答案 0 :(得分:13)
看起来,这是支持库工作方式的一个错误,并且没有以任何方式记录。
我已尝试发布有关它的错误报告,但Google将其标记为&#34; UserError&#34;,即使我没有看到它记录在案,或有任何警告:
按预期工作。除非容器中不支持向量 你打开 AppComaptDelegate.setCompatVectorFromResourcesEnabled(真)。
https://code.google.com/p/android/issues/detail?id=210745
因此,如果您看到一个没有显示的选择器,或者导致此日志崩溃:
引起:android.content.res.Resources $ NotFoundException:来自可绘制资源ID的文件res / drawable / selector.xml#0x7f02004f
你应该避免在选择器中使用vectorDrawable,或者避免使用vectorDrawables.useSupportLibrary = true行。
您可以使用AppComaptDelegate.setCompatVectorFromResourcesEnabled(true),但according to the docs,这可能有问题(主要是内存/性能问题),建议不要使用它:
设置旧平台(&lt; API 21)上的矢量drawable是否可以 在DrawableContainer资源中使用。
启用后,AppCompat可以截取一些可绘制的通货膨胀 框架,它可以实现内部矢量抽象的隐式膨胀 DrawableContainer资源。然后你可以使用那些drawables 诸如android:src在ImageView上的地方,或者android:drawableLeft on TextView的。
此功能默认为禁用,因为启用它可能会导致问题 内存使用情况以及更新配置实例时出现问题。如果 您手动更新配置,然后您可能不想要 启用此功能。你被警告了。
即使禁用此功能,您仍然可以使用矢量资源 setImageResource(int)和它的app:srcCompat属性。他们也可以 用于AppComapt为您充气的任何内容,例如菜单 资源。
请注意:这仅在此后创建的活动中生效 调用
答案 1 :(得分:0)
我只是通过使用以下 XML 来实现的
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_icons8_download_from_the_cloudwhite" android:state_focused="false" android:state_pressed="false" />
<item android:drawable="@drawable/ic_download_from_the_cloudclicked" android:state_focused="true" android:state_pressed="true" />
<item android:drawable="@drawable/ic_download_from_the_cloudclicked" android:state_focused="false" android:state_pressed="true" />
<item android:drawable="@drawable/ic_download_from_the_cloudclicked" android:state_focused="false" />
</selector>
希望这对有同样问题的人有所帮助
答案 2 :(得分:-1)
只需创建带有更改颜色的xml。并在运行时为按钮设置选定的颜色。