NetworkImageView从文件中设置图像

Gui*_*rme 0 java android image networkimageview

我有一个NetworkImageView从URL加载其内容,但在特定情况下,我还希望能够从用户的图库加载图像(甚至用相机捕获一个).

我正在使用Image Chooser Library从图库中加载图像,选择后,它允许我获取图像的文件路径.这条路就像/mnt/sdcard/bimagechooser/IMG_20140811_155007906.jpg

如果我尝试直接从此路径加载图像,Volley将引发异常,说明:

NetworkDispatcher.run:未处理的异常java.lang.RuntimeException:错误的URL /mnt/sdcard/bimagechooser/IMG_20140811_155007906.jpg

我也试过设置drawable:

Drawable newImage = Drawable.createFromPath(imagePath);
mNetworkImageView.setImageDrawable(newImage);
Run Code Online (Sandbox Code Playgroud)

当这些线条运行时没有任何反应,视图保持空白/不变.

NetworkImageView没有URL 设置内容的正确方法是什么?

Tom*_*itt 5

setImageDrawable不起作用的原因是因为在onLayoutsetImageUrl调用私有方法loadImageIfNecessary,setDefaultImageOrNull如果没有提供图像URL ,它将调用另一个私有方法.这会消除您设置的任何内容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);
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以像@mmlooloo建议的那样手动将图像添加到图像缓存中,或者根据Volley创建自己的"NetworkImageView",并且在没有提供url时onLayout不调用loadImageIfNecessary.然后,您可以覆盖ImageView设置器 setImageDrawable并将setImageURIURL设置为null.然后,您可以像使用ImageView一样使用setImageDrawable和setImageURI.

注意:如果您覆盖setImageBitmapsetImageResource调用这些问题,则可能会遇到问题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);
}    

}
Run Code Online (Sandbox Code Playgroud)