如何在Android中清除ImageView?

309

我正在重复使用 ImageView 来显示数据,但有时候我没有值来显示。

那么,如何清除 Android 中的 ImageView 呢?

我尝试过:

mPhotoView.invalidate();
mPhotoView.setImageBitmap(null);

它们中没有一个清除了视图,它仍然显示先前的图像。


1
我建议在没有值的情况下加载默认图像。 - Praveen
3
我没有默认图片,只有一个背景。我只需要保留这个背景。 - Pentium10
我认为这里需要更改已接受的答案。在stackoverflow上是否有任何规定可以将已接受的答案更改/移动到实际答案(或更好的答案)而不是“解决方法”答案?因为很多用户(如我)会选择已接受的答案,而不是更好的答案。 - Shirish Herwade
1
@ShirishHerwade 好的,已更改。 - Pentium10
我曾经遇到过同样的问题,我是这样解决的:https://dev59.com/dmkx5IYBdhLWcg3wA_tS#50448536 - Syed Danish Haider
我会创建一个默认的图像资源,并在一个 if 语句下,当图像应该被设置在第一个位置时,在 else 子句下编写以下内容:imageView.setImageResource(R.drawable.default_resource.jpg); - goldenmaza
18个回答

607

我曾经使用dennis.sheppard的解决方案来完成这个任务:

viewToUse.setImageResource(0);

它可以工作,但没有文档说明,所以不清楚它是否会影响视图中的其他内容(如果您愿意,可以查看ImageView代码,我没有)。

我认为最好的解决方案是:

viewToUse.setImageResource(android.R.color.transparent);

我最喜欢这个解决方案,因为撤销状态没有什么棘手的问题,而且它做的事情也很清楚。


3
我认为在Android 2.2.1上,使用带有颜色标识符的setImageResource会导致应用程序崩溃。 - Blundell
2
对我来说,viewToUse.setImageResource(android.R.color.transparent); 代码有效。 - Javier
3
请注意,如果您实际上拥有ID为0的资源,则会将该可绘制对象设置为您的图片视图。不确定具有该ID的概率有多大... - Chris
1
我在使用setImageResource(0)时遇到了问题——它并不总是起作用。但将其设置为透明非常可靠。谢谢! - SMBiggs
6
viewToUse.setImageResource(0); 没有生效,但 viewToUse.setImageResource(android.R.color.transparent); 生效了。 (Explanation: The first line of code did not work, but the second line of code using the resource ID for transparent color in the Android system worked.) - zionpi
显示剩余9条评论

146

我曾遇到类似的问题,需要将ImageView完全从屏幕上删除。这里的某些答案给了我正确的方向,但最终调用setImageDrawable()对我有效:

imgView.setImageDrawable(null);

(正如在评论中提到的那样,这种用法在官方文档中有记录:ImageView#setImageDrawable。)

3
在我的应用中,这个方法可靠地有效。setImageResource(0) 有时可以工作,但有时则不行。 - Hong
5
如果您使用setImageBitmap设置了图像,那么这就是您想要的。 - Kevin Parker
这是我认为最好的答案!它干净、有效且非常简短。不需要定义一个空的可绘制对象或应用它之类的东西。 - Potaito
这个答案实际上非常可靠!而且它是最早将这段代码作为解决方案的帖子。因此,我给这个答案点了赞,而不是其他给出相同答案的帖子。 - The Original Android
这在我的 Android M 上没有起作用。我不得不将 View 设置为 Invisible。 - likejudo
4
这个答案实际上在官方文档上有记录:https://developer.android.com/reference/android/widget/ImageView.html#setImageDrawable(android.graphics.drawable.Drawable)。 - user6046168

78

我知道这个问题很老了,但我仍然能够用

完成它。

viewToUse.setImageResource(0);

看起来似乎不应该奏效,但我凭直觉尝试了一下,结果完美。


2
实际上,将其设置为任何无效的图像资源都可以工作(-1、45等)。 - dvallejo
8
不,将其设置为-1会导致android.content.res.Resources$NotFoundException。将其设置为0似乎可以正常工作。 - NateS
28
当你滚动列表视图时,有些情况下将其设置为0的图像视图会显示错误的图像(它会显示另一个图像视图中的图像),以下解决方法可解决该问题: 使用viewToUse.setImageResource(android.R.color.transparent); - Sruit A.Suk
3
尝试使用这种方法时,我曾遇到过这个错误:“android.content.res.Resources$NotFoundException: Resource ID #0x0”,因此似乎将一个空图像设置为“清除” ImageView 的最佳方式。 - Pavel Alexeev

15

看起来你想要一个默认的图片来设置ImageView,当它没有显示其他图片时使用。这就是联系人应用程序的做法:

if (photoId == 0) {
    viewToUse.setImageResource(R.drawable.ic_contact_list_picture);
} else {
    // ... here is where they set an actual image ...
}

68
不,我不想要这个。我只想清除内容。用户可以在之后选择新的图片。 - Pentium10
3
联系人应用程序是开源的(http://android.git.kernel.org/?p=platform/packages/apps/Contacts.git;a=tree)。我调查了源代码,发现他们使用QuickContactBadge(ImageView的子类),当他们没有照片时,他们使用setImageResource来设置默认图片。请查看com.android.contacts.ContactsListActivity#ContactItemListAdapter中的细节,特别是在getView()方法中。 - Dan Lew
9
如果那个答案不是你想要的,为什么你会把它选为正确答案? - arniotaki
3
人们希望图像清晰可能有很多原因。 - basickarl
1
他不想要默认图片。他希望它被清除。 - EpicPandaForce
显示剩余2条评论

15

我曾尝试这样做,以清除ImageView中的图像和Drawable缓存

ImgView.setImageBitmap(null);
ImgView.destroyDrawingCache();

我希望这对你有用!


12
如果这些解决方案都不能清除您已经设置的图像(特别是setImageResource(0)setImageResources(android.R.color.transparent)),请检查当前图像是否作为背景使用了setBackgroundDrawable(...)或类似的东西。
您的代码只会将前景中的图像资源设置为透明,位于您设置的背景图像的前面并仍然显示。

11

如果您使用Glide,您可以像这样完成它。

Glide.with(yourImageView).clear(yourImageView)

谢谢refig,它帮了很大的忙。 - ucMedia
我认为第一个yourImageView应该是context - mcy
没有区别,Glide从imageView获取上下文。 - Mojtaba Haddadi

6

嘿,我知道我回答得非常晚,但想与大家分享一下:

重置图片时调用的方法必须与设置图片时调用的方法相同。

如果您最初是使用setImageResource()在位图中设置图像,则要重置图像源,@dennis.sheepard的答案很好用。

例如:

我使用了setImageBitmap(),因此设置setImageResource(0)没有起作用,而是使用setImageBitmap(null)


1
你是正确的Ajay,我也观察到了同样的现象。我在同一个ImageView上根据条件交替使用setImageBitmap() / setImageResource()方法。因此,我不得不使用setImageResource(0) / setImageBitmap(null)来清除ImageView。谢谢! - Monica M

3

我通过定义可绘制对象(类似 blank_white_shape.xml)来实现这一点:

<shape xmlns:android="http://schemas.android.com/apk/res/android"       
       android:shape="rectangle">
    <solid android:color="@android:color/white"/>
</shape>

然后,当我想要清除图像视图时,我只需调用

 imageView.setImage(R.drawable.blank_white_shape);

这对我非常有效!


3
这对我有效。
emoji.setBackground(null);

这段代码在运行时崩溃。

viewToUse.setImageResource(android.R.color.transparent);  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接