Comment effacer une ImageView dans Android?

277

Je réutilise des ImageViews pour mes affichages, mais à un moment donné, je n'ai pas de valeurs pour les mettre.

Alors, comment effacer un ImageViewdans Android?

J'ai essayé:

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

Aucun d'eux n'a effacé la vue, elle montre toujours l'image précédente.

Pentium10
la source
1
je suggère de charger l'image par défaut lorsque vous n'avez aucune valeur.
Praveen
3
Je n'ai pas d'image par défaut, juste un arrière-plan. J'ai besoin d'avoir juste l'arrière-plan.
Pentium10
Je pense que la réponse acceptée doit être modifiée ici. Y a-t-il une disposition sur stackoverflow pour changer / déplacer la réponse acceptée à la réponse réelle (ou plus meilleure réponse) à partir d'une réponse de «contournement»? Parce que beaucoup d'utilisateurs (comme moi) peuvent opter pour une réponse acceptée plutôt que meilleure
Shirish Herwade
1
@ShirishHerwade ok changé
Pentium10
J'étais confronté au même problème que je le fais comme ceci: stackoverflow.com/a/50448536/5697474
Syed Danish Haider

Réponses:

540

Je le faisais avec la solution dennis.sheppard :

viewToUse.setImageResource(0);

cela fonctionne, mais il n'est pas documenté, il n'est donc pas vraiment clair s'il affecte autre chose dans la vue (vous pouvez vérifier le code ImageView si vous le souhaitez, je ne l'ai pas fait).

Je pense que la meilleure solution est:

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

J'aime le plus cette solution car il n'y a rien de délicat à rétablir l'état et c'est aussi clair ce qu'elle fait.

Mario Lenci
la source
3
Je pense que l'utilisation de setImageResource avec un identificateur de couleur vous donnera des problèmes de plantage sur Android 2.2.1
Blundell
2
pour moi fonctionne le viewToUse.setImageResource (android.R.color.transparent); code
Javier
3
méfiez-vous de cela, si vous avez réellement une ressource avec un identifiant de 0, cela rendra en fait ce dessinable comme vue de votre image. Je ne sais pas quelles sont les chances d'avoir cela comme identifiant.
Chris
1
J'ai eu des problèmes avec setImageResource (0) - n'a pas toujours fonctionné. Mais le définir sur transparent est très fiable. Merci!
Scott Biggs du
6
viewToUse.setImageResource(0);ne fonctionne pas, mais le viewToUse.setImageResource(android.R.color.transparent);travaillé.
zionpi
119

J'ai eu un problème similaire, où j'ai dû supprimer complètement ImageViews de l'écran. Certaines des réponses ici m'ont conduit dans la bonne direction, mais finalement, appeler setImageDrawable () a fonctionné pour moi:

imgView.setImageDrawable(null);

(Comme mentionné dans le commentaire, une telle utilisation est documentée dans les documents officiels: ImageView # setImageDrawable .)

Kon
la source
3
Cela fonctionne de manière fiable au moins dans mon application. setImageResource (0) fonctionne parfois, mais pas d'autres.
Hong
5
Si vous avez défini l'image à l'aide de setImageBitmap, c'est ce que vous voulez
Kevin Parker
C'est à mon avis la meilleure réponse! C'est propre, valide et très court. Pas besoin de définir un dessin vierge et de l'appliquer ou des trucs comme ça.
Potaito
Cette réponse fonctionne réellement de manière fiable! Et c'est le premier article indiquant ce code comme solution. Par conséquent, j'ai voté pour celui-ci et non pour d'autres messages avec la même réponse.
L'original Android
2
Cette réponse est en fait documentée sur les documents officiels: developer.android.com/reference/android/widget/…
79

Je sais que c'est vieux, mais j'ai pu y arriver avec

viewToUse.setImageResource(0);

Il ne semble pas que cela devrait fonctionner, mais je l'ai essayé sur un coup de tête, et cela a fonctionné parfaitement.

dennis.sheppard
la source
2
En fait, le définir sur N'IMPORTE QUELLE ressource d'image invalide fonctionne (-1, 45, etc.)
dvallejo
8
Non, la valeur -1 vous donne android.content.res.Resources $ NotFoundException. 0 semble fonctionner.
NateS
28
Ce cas, lorsque vous faites défiler votre liste. d'une manière ou d'une autre, l'image qui l'a définie sur 0 affichera la mauvaise image (elle affichera l'image d'une autre image) afin que la résolution ci-dessous puisse le faire viewToUse.setImageResource (android.R.color.transparent);
Sruit A.Suk
3
J'ai eu cette erreur une fois, en essayant cette méthode: "android.content.res.Resources $ NotFoundException: Resource ID # 0x0", il semble donc que définir une image vide soit le meilleur moyen de "vider" l'ImageView
Pavel Alexeev
16

Il semble que ce que vous voulez soit une image par défaut pour définir votre ImageView lorsqu'elle n'affiche pas une image différente. Voici comment fonctionne l'application Contacts:

if (photoId == 0) {
    viewToUse.setImageResource(R.drawable.ic_contact_list_picture);
} else {
    // ... here is where they set an actual image ...
}
Dan Lew
la source
67
Non, je ne veux pas de ça. Je veux juste effacer le contenu. L'utilisateur peut sélectionner une nouvelle image après.
Pentium10
3
L'application Contacts est open source ( android.git.kernel.org/?p=platform/packages/apps/… ). J'ai étudié le code source. Il s'avère qu'ils utilisent un QuickContactBadge (une sous-classe d'ImageView), et lorsqu'ils n'ont pas de photo, ils utilisent setImageResource pour définir une image par défaut. Vérifiez com.android.contacts.ContactsListActivity # ContactItemListAdapter pour les détails, en particulier dans getView ().
Dan Lew
9
Pourquoi avez-vous vérifié cette réponse comme étant la bonne si ce n'est pas ce que vous voulez?
arniotaki
3
Daniel Il peut y avoir plusieurs raisons pour lesquelles les gens veulent que l'image soit claire.
K - La toxicité du SO augmente.
1
Il ne veut pas d'image par défaut. Il veut qu'il soit effacé.
EpicPandaForce
13

J'ai essayé ceci pour effacer Image et DrawableCache dans ImageView

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

J'espère que cela fonctionne pour vous!

nandha
la source
9

Si aucune de ces solutions n'efface une image que vous avez déjà définie (en particulier setImageResource(0)ou setImageResources(android.R.color.transparent), vérifiez que l'image actuelle n'est pas définie comme arrière-plan à l'aide desetBackgroundDrawable(...) ou quelque chose de similaire.

Votre code définira simplement la ressource d'image au premier plan sur quelque chose de transparent devant l'image d'arrière-plan que vous avez définie et s'affichera toujours.

Brad English
la source
6

Hé, je sais que je suis extrêmement en retard à cette réponse, mais je pensais juste que je devais partager cela,

La méthode à appeler lorsque vous réinitialisez l'image doit être la même que celle que vous avez appelée pendant que vous la définissiez.

Lorsque vous souhaitez réinitialiser la source de l' image @ dennis.sheepard, la réponse ne fonctionne correctement que si vous définissez initialement l'image dans le bitmap à l'aidesetImageResource()

par exemple,

j'avais utilisé setImageBitmap()et donc le réglage setImageResource(0)n'a pas fonctionné setImageBitmap(null).

Ajay
la source
1
Tu as raison Ajay, j'ai observé la même chose. J'ai utilisé setImageBitmap () / setImageResource () alternativement pour la même image en fonction des conditions. J'ai donc dû utiliser alternativement setImageResource (0) / setImageBitmap (null) pour effacer l'image. Merci!
Monica M
5

si vous utilisez la glisse, vous pouvez le faire comme ça.

Glide.with(yourImageView).clear(yourImageView)
Mojtaba Haddadi
la source
Merci refig, ça aide beaucoup.
ucMedia
3

J'ai pu y parvenir en définissant un dessinable (quelque chose comme blank_white_shape.xml):

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

Ensuite, quand je veux effacer la vue de l'image, je viens d'appeler

 imageView.setImage(R.drawable.blank_white_shape);

Cela fonctionne à merveille pour moi!

kwasi
la source
2

Pour l'image d'élément ListView, vous pouvez définir ImageView.setVisibility(View.INVISIBLE)ou ImageView.setImageBitmap(null)dans l'adaptateur de liste pour le cas "pas d'image".

Arvis
la source
2

Comme kwasi a écrit et golu édité, vous pouvez utiliser transparent, au lieu de blanc:

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

A l'intérieur d'une activité, vue, etc:

view.setImageResource(R.drawable.transparent);
KitKat
la source
1

Cela fonctionne pour moi.

emoji.setBackground(null);

Cela se bloque lors de l'exécution.

viewToUse.setImageResource(android.R.color.transparent);  
sbchitra
la source
0

Pour supprimer l'image dans ImageView:

title_image.setImageResource(-1);

cela fonctionne pour moi

Tobore Igbe
la source
0

Si vous utilisez la bibliothèque de support, vous obtenez à la AppCompatImageViewplace de ImageView, qui prend setImageResource(0)en charge sur tous les appareils, vous devriez donc l'utiliser correctement de la même manière quesetImageDrawable(null) etsetImageBitmap(null)

Sinon, cela devrait fonctionner correctement à partir d'une version Android. Selon le code d'Android et selon mes tests, je pense qu'il devrait être sûr d'utiliser setImageResource(0)depuis Android API 22 (5.1). Vous pouvez voir le code Android d'API 22 vs API 21, ici

développeur android
la source
0

J'étais confronté au même problème que j'ai changé la couleur d'arrière-plan de la vue en une couleur d'arrière-plan de mise en page que vous pouvez faire comme ceci:

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

// puis définir l'image

edit_countflag.setImageResource(R.drawable.flag_id);
Syed Danish Haider
la source
0

J'ai également essayé de supprimer l'image de l'ImageView, ImageView.setImageRessource(0)mais cela n'a pas fonctionné pour moi.
Heureusement, j'ai reçu ce message dans les journaux:

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

Alors disons, layoutmanagerest votre instance pour la mise en page, que vous devez faire:

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

// this line worked for me
layoutManager.removeView(image);
TornaxO7
la source
-1

Puis-je simplement signaler ce que vous essayez tous de définir et où il attend un dessinable.

ne devriez-vous pas faire ce qui suit?

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

imageview.setImageDrawable(getApplicationContext().getResources().getDrawable(R.drawable.icon_profile_image));
Aaron Newton
la source