setImageDrawable
不起作用的原因是因为 in onLayout
andsetImageUrl
调用了私有方法,如果没有提供图像 url loadImageIfNecessary
,它将调用另一个私有方法。setDefaultImageOrNull
这会清除您通过设置的任何内容setImageDrawable
。
Volley 的 NetworkImageView 代码...
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
loadImageIfNecessary(true);
}
void loadImageIfNecessary(final boolean isInLayoutPass) {
...
// if the URL to be loaded in this view is empty, cancel any old requests and clear the
// currently loaded image.
if (TextUtils.isEmpty(mUrl)) {
if (mImageContainer != null) {
mImageContainer.cancelRequest();
mImageContainer = null;
}
setDefaultImageOrNull();
return;
}
...
}
private void setDefaultImageOrNull() {
if(mDefaultImageId != 0) {
setImageResource(mDefaultImageId);
}
else {
setImageBitmap(null);
}
}
您可以按照@mmlooloo 的建议进行操作,手动将图像添加到图像缓存中,或者根据 Volley 创建自己的“NetworkImageView”,并且在没有提供 url 时onLayout
不调用。loadImageIfNecessary
然后,您可以覆盖 ImageView 设置器 setImageDrawable
并将setImageURI
url 设置为 null。然后,您可以像使用 ImageView 一样使用 setImageDrawable 和 setImageURI。
setImageBitmap
注意:如果您setImageResource
在loadImageIfNecessary
. 我还没有遇到问题,但是我没有做太多的测试。
你的班...
public class MyNetworkImageView extends ImageView {
//Copy the code from Volley's NetworkImageView and change onLayout as below.
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (!TextUtils.isEmpty(mUrl)) {
loadImageIfNecessary(true);
}else{
if (mImageContainer != null) {
mImageContainer.cancelRequest();
mImageContainer = null;
}
}
}
//Change the other ImageView image setters, for example...
@Override
public void setImageDrawable(Drawable drawable) {
mUrl = null;
super.setImageDrawable(drawable);
}
@Override
public void setImageURI(Uri uri) {
mUrl = null;
super.setImageURI(uri);
}
}