如何在Android中清除ImageView?


277

我正在将ImageViews用于显示,但是在某些时候我没有值可言。

那么如何清除ImageViewAndroid中的?

我试过了:

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

他们都没有清除视图,它仍然显示以前的图像。


1
我建议您在没有价值时加载默认图像。
Praveen

3
我没有默认图像,只有背景。我只需要有背景。
Pentium10'5

我认为已接受的答案需要在此处进行更改。是否有关于Stackoverflow的任何规定,以从“变通方法”答案中更改/移动已接受的答案到实际答案(或更佳的答案)?因为许多用户(例如我)可以寻求接受而不是更好的答案
Shirish Herwade 2015年

1
@ShirishHerwade ok更改
Pentium10 '10

我正面临着这样的问题:stackoverflow.com/a/50448536/5697474
Syed Danish Haider

Answers:


540

我曾经使用dennis.sheppard解决方案来做到这一点

viewToUse.setImageResource(0);

它可以工作,但没有记录,因此尚不清楚它是否会影响视图中的其他内容(如果您愿意,可以查看ImageView代码,我没有)。

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

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

我最喜欢这种解决方案,因为恢复状态没有任何棘手的事情,而且也很清楚它在做什么。


3
我认为使用带有颜色标识符的setImageResource会给您带来Android 2.2.1崩溃的问题
Blundell,

2
对我来说,viewToUse.setImageResource(android.R.color.transparent); 码
哈维尔

3
提防这一点,如果您实际上拥有一个ID为0的资源,则会将可绘制的集合作为您的视图实际使用。不确定将其作为ID的机会是什么
克里斯

1
我在setImageResource(0)上遇到问题-并非总是能正常工作。但是将其设置为透明是非常可靠的。谢谢!
Scott Biggs 2014年

6
viewToUse.setImageResource(0);没有用,但是viewToUse.setImageResource(android.R.color.transparent);有用。
zionpi

118

我有一个类似的问题,我需要从屏幕上完全删除ImageViews。这里的一些答案将我引向正确的方向,但最终调用setImageDrawable()对我有用:

imgView.setImageDrawable(null);

(如评论中所述,这种用法记录在官方文档:ImageView#setImageDrawable中。)


3
这至少在我的应用程序中可靠地工作。setImageResource(0)有时会起作用,但其他情况不会起作用。

5
如果您使用setImageBitmap设置了图像,这就是您想要的
Kevin Parker

我认为这是最好的答案!很干净,有效且很短。无需定义空白可绘制对象并应用它或类似的东西。
Potaito

这个答案实际上工作可靠!这是最早将这种代码作为解决方案的文章。因此,我投票给这一职位,而不是其他具有相同答案的职位。
原始Android

2
这个答案其实是记录在官方文档:developer.android.com/reference/android/widget/...

79

我知道这已经很老了,但是我能够通过

viewToUse.setImageResource(0);

似乎它不应该工作,但是我一时兴起尝试了一下,并且效果很好。


2
实际上,将其设置为任何无效的图像资源均有效(
-1、45

8
不,设置为-1可为您提供android.content.res.Resources $ NotFoundException。0似乎有效。
NateS 2011年

28
在这种情况下,当您滚动列表视图时。以某种方式将其设置为0的imageview将显示错误的图像(它将显示另一个imageview的图像),因此下面的分辨率可以做到这一点viewToUse.setImageResource(android.R.color.transparent);
Sruit A.Suk

3
尝试此方法时,我一次收到此错误:“ android.content.res.Resources $ NotFoundException:资源ID#0x0”,因此设置空图像似乎是“清除” ImageView的最佳方法
Pavel Alexeev

16

听起来好像您想要的是默认图像,以便在不显示其他图像时将ImageView设置为默认图像。这是“联系人”应用程序的执行方式:

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

67
不,我不要这个。我只想清除内容。用户可以在之后选择新图像。
Pentium10'5

3
Contacts应用程序是开源的(android.git.kernel.org/?p=platform/packages/apps/…)。我研究了源代码。事实证明,他们正在使用QuickContactBadge(ImageView的子类),并且当他们没有照片时,他们使用setImageResource设置默认图像。检查com.android.contacts.ContactsListActivity#ContactItemListAdapter的详细信息,尤其是在getView()中。
丹·卢

9
如果不是您想要的答案,为什么还要检查该答案是否正确?
arniotaki

3
Daniel人们为什么想要清晰的图像可能有很多原因。
K-SO的毒性在增加。

1
他不需要默认图像。他希望将其清除。
EpicPandaForce '16

13

我试图这样做以清除ImageView中的Image和DrawableCache

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

希望这对您有用!


9

如果这些解决方案都无法清除您已经设置的图像(尤其是setImageResource(0)setImageResources(android.R.color.transparent),请检查并确保未使用设置将当前图像设置为背景setBackgroundDrawable(...)或类似方法。

您的代码只会将前景中的图像资源设置为已设置的背景图像前面的透明对象,并且仍会显示。


6

嘿,我知道我对这个答案非常迟,但是以为我必须分享这个答案,

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

当您想重置图像源@ dennis.sheepard答案仅在您最初使用以下方法图中设置图像时有效setImageResource()

例如,

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


1
你说得对,阿杰,我也观察到同样的情况。我根据条件将setImageBitmap()/ setImageResource()用于相同的imageview。因此,我不得不使用setImageResource(0)/ setImageBitmap(null)alternativley来清除图像视图。谢谢!
莫妮卡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);

这对我来说效果很好!


2

对于ListView项目图像,您可以在“无图像”情况下设置ImageView.setVisibility(View.INVISIBLE)ImageView.setImageBitmap(null)在列表适配器中。


2

正如kwasi编写和golu编辑的那样,您可以使用透明而不是白色:

文件 drawable/transparent.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <solid android:color="@android:color/transparent"/>
</shape>

在活动,视图等内部:

view.setImageResource(R.drawable.transparent);

1

这对我有用。

emoji.setBackground(null);

这在运行时崩溃。

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

0

要在ImageView中删除图像,请使用:

title_image.setImageResource(-1);

它对我有用


0

如果您使用支持库,则获取AppCompatImageView而不是ImageView,该库setImageResource(0)在所有设备上均受支持,因此使用它的方式应该与使用和相同setImageDrawable(null)setImageBitmap(null)

否则,从某些Android版本开始应该可以正常工作。根据Android的代码和我的测试,我认为setImageResource(0)从Android API 22(5.1)使用它应该是安全的。您可以在此处查看 API 22 vs API 21的Android代码


0

我面临着同样的问题,我将视图的背景色更改为布局背景色,您可以这样做:

 edit_countflag.setBackgroundColor(Color.parseColor("#ffffff"));

//然后设置图片

edit_countflag.setImageResource(R.drawable.flag_id);

0

我也尝试通过使用删除ImageView的图像,ImageView.setImageRessource(0)但是它对我不起作用。
幸运的是,我在日志中收到此消息:

Caused by: java.lang.IllegalStateException: The specified child already has a parent. 
You must call removeView() on the child's parent first.

假设layoutmanager您是版式的实例,而不是您需要这样做的实例:

RelativeLayout layoutManager = new RelativeLayout(this);
ImageView image = new ImageView(this);

// this line worked for me
layoutManager.removeView(image);

-1

我能指出一下您都在尝试设置什么吗,并把它期望为可绘制区域。

您不应该执行以下操作吗?

imageview.setImageDrawable(this.getResources().getDrawable(R.drawable.icon_image));

imageview.setImageDrawable(getApplicationContext().getResources().getDrawable(R.drawable.icon_profile_image));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.