我有一个NetworkImageView
,它从 URL 加载其内容,但在特定情况下,我还希望能够从用户的图库加载图像(甚至用相机捕获图像) .
我正在使用Image Chooser Library从图库中加载图像,选择后,它允许我获取图像的文件路径。该路径类似于 /mnt/sdcard/bimagechooser/IMG_20140811_155007906.jpg
如果我尝试直接从该路径加载图像,Volley 将引发异常:
NetworkDispatcher.run: Unhandled exception java.lang.RuntimeException: Bad URL
/mnt/sdcard/bimagechooser/IMG_20140811_155007906.jpg
我还尝试设置可绘制对象:
Drawable newImage = Drawable.createFromPath(imagePath);
mNetworkImageView.setImageDrawable(newImage);
当这些行运行时,什么也没有发生, View 保持为空/不变。
在没有 URL 的情况下设置 NetworkImageView
内容的正确方法是什么?
最佳答案
setImageDrawable
不起作用的原因是在onLayout
和setImageUrl
中调用了私有(private)方法loadImageIfNecessary
,如果没有提供图像 url,它将调用另一个私有(private)方法 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”,并且让 onLayout
不调用 loadImageIfNecessary
当没有提供 url 时。然后,您可以重写 ImageView setter setImageDrawable
和 setImageURI
将 url 设置为 null。然后,您可以像平常使用 ImageView 一样使用 setImageDrawable 和 setImageURI。
注意:如果您重写 setImageBitmap
或 setImageResource
方法,则可能会遇到问题,因为这些方法是在 loadImageIfNecessary
中调用的。我还没有遇到问题,但是我还没有进行太多测试。
你的类(class)...
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);
}
}
关于java - NetworkImageView 从文件设置图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25251193/