How to clear an ImageView in Android?
Asked Answered
E

19

311

I am reusing ImageViews for my displays, but at some point I don't have values to put it.

So how to clear an ImageView in Android?

I've tried:

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

None of them have cleared the view, it still shows previous image.

Extinctive answered 18/5, 2010 at 16:35 Comment(6)
i suggest to load the default image when you have no value.Sassenach
I have no default image, just a background. I need to have just the background.Extinctive
I think accepted answer needs to be changed here. Is there any provision on stackoverflow to change/move accepted answer to actual answer(or more better answer) from a 'workaround' answer? Because lot of users(like me) can go for accepted rather than better answerSsm
@ShirishHerwade ok changedExtinctive
I was facing the same issue i do it like this: https://mcmap.net/q/101314/-how-to-clear-imageview-correctlySoftspoken
I would just create a default image resource and under an if-statement, where the image is suppose to be set in the first place, I would just write the following under the else-clause: imageView.setImageResource(R.drawable.default_resource.jpg);Attestation
A
609

I used to do it with the dennis.sheppard solution:

viewToUse.setImageResource(0);

it works but it is not documented so it isn't really clear if it effects something else in the view (you can check the ImageView code if you like, i didn't).

I think the best solution is:

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

I like this solution the most cause there isn't anything tricky in reverting the state and it's also clear what it is doing.

Agrimony answered 23/11, 2011 at 13:42 Comment(14)
I think using setImageResource with a color identifier will give you crashing issues on Android 2.2.1Carbineer
that is possible. I don't have a device to test it. did you test it? in case write here and I'll edit the answer ( and my code :) ). I tested it on an xperia U20i with a 2.1-update1 and works as expected.Agrimony
for me works the viewToUse.setImageResource(android.R.color.transparent); codeBeriosova
This won't work if you've set a drawable instead of a uri or a resourceArachnid
are you talking about the first solution? That's possible, but i'm sure the second solution works in every caseAgrimony
beware of this, if you actually have a resource with an id of 0 this will infact set that drawable as yourmage view. Not sure what the chances are of having that as an id though..Midis
I had problems with the setImageResource(0)--didn't always work. But setting it to transparent is very reliable. Thanks!Behling
viewToUse.setImageResource(0); does not worked,but the viewToUse.setImageResource(android.R.color.transparent); worked.Jink
If you are trying to clear a background images instead of src then use viewToUse.setBackgroundResource(android.R.color.transparent);Butanone
Yeah dont use the 0 trick - some times Android looks for a resource with id 0 and then it blows up. Oddly this is random behaviour - so hard to spot.Polysepalous
setting a transparent background might cause to overdraw problem. even transparent pixels are being renderedDispatch
Didn't work for me inside a ListView Try this image.setImageBitmap(null);Goodly
About viewToUse.setImageResource(0) , this should work only if you use the support library (which automatically gives you AppCompatImageView instead of ImageView), or if you are on Android 5.1 (API 22) and above. I wrote about it here: https://mcmap.net/q/99204/-how-to-clear-an-imageview-in-androidPropinquity
viewToUse.setImageResource(0) does not work on Kitkat but works on higher android versionsMandy
C
146

I had a similar problem, where I needed to basically remove ImageViews from the screen completely. Some of the answers here led me in the right direction, but ultimately calling setImageDrawable() worked for me:

imgView.setImageDrawable(null);

(As mentioned in the comment, such usage is documented in the official docs: ImageView#setImageDrawable.)

Counterstamp answered 9/4, 2011 at 16:36 Comment(6)
This works reliably at least in my app. setImageResource(0) works sometimes, but not others.Catastrophe
If you've set the image using setImageBitmap this is what you wantSchmidt
This is in my opinion the best answer! It's clean, valid and very short. No need to define a blank drawable and apply it or stuff like that.Dyna
This answer actually works reliably! And it is the earliest post stating this code as a solution. Hence I upvoted this one and not other posts with the same answer.Annam
This did not work for me on Android M. I had to set View to be Invisible.Thorson
This answer is actually documented on the official docs: developer.android.com/reference/android/widget/…Zacheryzack
S
78

I know this is old, but I was able to accomplish this with

viewToUse.setImageResource(0);

Doesn't seem like it should work, but I tried it on a whim, and it worked perfectly.

Stopped answered 1/11, 2010 at 16:36 Comment(4)
Actually, setting it to ANY invalid image resource works (-1, 45, etc)Carbajal
No, setting to -1 gives you android.content.res.Resources$NotFoundException. 0 seems to work.Singband
This case, when you scrolling your listview. somehow the imageview that set it as 0 will show the wrong image (it will show image from another imageview) so the resolution below can do it viewToUse.setImageResource(android.R.color.transparent);Meekins
I got this error once, when trying this method: "android.content.res.Resources$NotFoundException: Resource ID #0x0", so it seems that setting an empty image is the best way to "clear" the ImageViewDereism
L
15

It sounds like what you want is a default image to set your ImageView to when it's not displaying a different image. This is how the Contacts application does it:

if (photoId == 0) {
    viewToUse.setImageResource(R.drawable.ic_contact_list_picture);
} else {
    // ... here is where they set an actual image ...
}
Lewls answered 18/5, 2010 at 17:5 Comment(7)
No, I don't want this. I want just to clear the contents. The user may select new image after.Extinctive
I don't understand then. You don't want any image to be shown, but you don't have a default image to show to the user when no image is shown. There's either something you do want to show the user or not. You could set the background to be the image resource even.Lewls
If you are familiar with Contacts there is a contact card background frame replacer, I have that in my code. <ImageView android:id="@+id/photo" android:layout_width="54dip" android:layout_height="57dip" android:layout_marginLeft="0dip" android:background="@drawable/quickcontact_photo_frame" /> This is a simple gray background into which comes the photo.Extinctive
The Contacts app is open source (android.git.kernel.org/?p=platform/packages/apps/…). I investigated the source code. It turns out that they are using a QuickContactBadge (a subclass of ImageView), and when they don't have a photo, they use setImageResource to set a default image. Check com.android.contacts.ContactsListActivity#ContactItemListAdapter for the details, especially in getView().Lewls
Why did you checked that answer as the right one if it is not what you want?Cullis
Daniel There may be many reasons as to why people want the image clear.Margaux
He does not want a default image. He wants it to be cleared.Fruitcake
J
15

I tried this for to clear Image and DrawableCache in ImageView

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

I hope this works for you !

Jordon answered 13/9, 2013 at 5:7 Comment(0)
Q
12

If none of these solutions are clearing an image you've already set (especially setImageResource(0) or setImageResources(android.R.color.transparent), check to make sure the current image isn't set as background using setBackgroundDrawable(...) or something similar.

Your code will just set the image resource in the foreground to something transparent in front of that background image you've set and will still show.

Quadratics answered 1/6, 2014 at 9:2 Comment(0)
T
11

if you use glide you can do it like this.

Glide.with(yourImageView).clear(yourImageView)
Tetrachord answered 8/12, 2019 at 6:30 Comment(3)
Thanks refig, It helps alot.Ulphi
I think the first yourImageView should be contextRheology
No difference, glide gets context from the imageViewTetrachord
N
6

Hey i know i am extremely late to this answer, but just thought i must share this,

The method to call when u reset the image must be the same method that u called while u were setting it.

When u want to reset the image source @dennis.sheepard answer works fine only if u are originally setting the image in the bitmap using setImageResource()

for instance,

i had used setImageBitmap() and hence setting setImageResource(0) didn work, instead i used setImageBitmap(null).

Nonappearance answered 31/1, 2013 at 11:10 Comment(1)
You are right Ajay,I observed the same. I used setImageBitmap()/setImageResource() alternatively for same imageview depending on the conditions. Hence I had to use setImageResource(0)/setImageBitmap(null) alternativley to clear the imageview. Thanks!Arron
F
3

I was able to achieve this by defining a drawable (something like blank_white_shape.xml):

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

Then when I want to clear the image view I just call

 imageView.setImage(R.drawable.blank_white_shape);

This works beautifully for me!

Far answered 11/2, 2011 at 20:18 Comment(0)
R
3

This works for me.

emoji.setBackground(null);

This crashes in runtime.

viewToUse.setImageResource(android.R.color.transparent);  
Responsory answered 18/2, 2019 at 20:42 Comment(0)
M
2

For ListView item image you can set ImageView.setVisibility(View.INVISIBLE) or ImageView.setImageBitmap(null) in list adapter for "no image" case.

Mistymisunderstand answered 18/1, 2013 at 17:1 Comment(0)
C
2

As kwasi wrote and golu edited, you can use transparent, instead of white:

File 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>

Inside an activity, view, etc:

view.setImageResource(R.drawable.transparent);
Coordinate answered 6/10, 2013 at 17:34 Comment(0)
P
1

If you use the support library, you get AppCompatImageView instead of ImageView , which supports setImageResource(0) on all devices, so you should be fine with using it the same way as using setImageDrawable(null) and setImageBitmap(null)

Otherwise, it should work fine starting from some Android version. According to the code of Android and according to my tests, I think it should be safe to use setImageResource(0) from Android API 22 (5.1). You can see the Android code of API 22 vs API 21, here

Propinquity answered 30/4, 2018 at 12:14 Comment(0)
G
0

To remove the image in ImageView use:

title_image.setImageResource(-1);

it works for me

Gazelle answered 26/2, 2016 at 11:6 Comment(0)
S
0

I was facing same issue i changed background color of view to layout background color u can do like this:

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

//then set the image

edit_countflag.setImageResource(R.drawable.flag_id);
Softspoken answered 21/5, 2018 at 12:15 Comment(0)
C
0

I tried to remove the Image of the ImageView too by using ImageView.setImageRessource(0) but it didn't work for me.
Luckily I got this message in the logs:

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

So let's say, layoutmanager is your instance for the layout, than you need to do that:

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

// this line worked for me
layoutManager.removeView(image);
Chunk answered 20/12, 2019 at 14:15 Comment(0)
T
0

I tried and they all work (one in 3 cases):

imageView.setImageResource(0);

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

imageView.setImageBitmap(null);

Or you can hide it:

imageView.setVisibility(View.GONE);
Tradein answered 4/1 at 7:36 Comment(0)
G
-1

Can i just point out what you are all trying to set and int where its expecting a drawable.

should you not be doing the following?

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

imageview.setImageDrawable(getApplicationContext().getResources().getDrawable(R.drawable.icon_profile_image));
Geneticist answered 12/4, 2012 at 10:46 Comment(0)
T
-2

editText.setText("");

imageView.setImageResource(0);

Terminator answered 4/4, 2021 at 8:46 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.