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 设置内容的正确方法是什么?
setImageDrawable不起作用的原因是因为在onLayout并setImageUrl调用私有方法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.
注意:如果您覆盖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);
}
}
Run Code Online (Sandbox Code Playgroud)