setImageDrawable
機能しない理由は、提供された画像の URL がない場合に別のプライベート メソッドを呼び出すonLayout
プライベートsetImageUrl
メソッドを呼び出すためです。これにより、 で設定したものはすべて消去されます。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);
}
}