Come cancellare un ImageView in Android?


277

Sto riutilizzando ImageView s per i miei display, ma ad un certo punto non ho valori per dirlo.

Quindi, come cancellare un ImageViewin Android?

Ho provato:

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

Nessuno di loro ha cancellato la vista, mostra ancora l'immagine precedente.


1
suggerisco di caricare l'immagine predefinita quando non si ha valore.
Praveen,

3
Non ho un'immagine predefinita, solo uno sfondo. Devo avere solo lo sfondo.
Pentium10

Penso che la risposta accettata debba essere cambiata qui. Esistono disposizioni su StackOverflow per modificare / spostare la risposta accettata alla risposta effettiva (o più risposta migliore) da una risposta "alternativa"? Perché molti utenti (come me) possono accettare la risposta accettata anziché migliore
Shirish Herwade,

1
@ShirishHerwade ok cambiato
Pentium10

Stavo affrontando lo stesso problema, lo faccio in questo modo: stackoverflow.com/a/50448536/5697474
Syed Danish Haider

Risposte:


540

Lo facevo con la soluzione dennis.sheppard :

viewToUse.setImageResource(0);

funziona ma non è documentato, quindi non è molto chiaro se influisce su qualcos'altro nella vista (puoi controllare il codice ImageView se vuoi, non l'ho fatto).

Penso che la soluzione migliore sia:

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

Mi piace questa soluzione soprattutto perché non c'è nulla di complicato nel ripristinare lo stato ed è anche chiaro cosa sta facendo.


3
Penso che l'utilizzo di setImageResource con un identificatore di colore ti dia problemi di crash su Android 2.2.1
Blundell

2
per me funziona viewToUse.setImageResource (android.R.color.transparent); codice
Javier

3
attenzione a questo, se in realtà si dispone di una risorsa con un ID pari a 0, questo imposterà tale disegnabile come visualizzazione del proprio mago. Non sono sicuro di quali siano le probabilità di averlo come ID ..
Chris,

1
Ho avuto problemi con setImageResource (0) - non ha sempre funzionato. Ma impostarlo su trasparente è molto affidabile. Grazie!
Scott Biggs,

6
viewToUse.setImageResource(0);non ha funzionato, ma ha viewToUse.setImageResource(android.R.color.transparent);funzionato.
zionpi,

119

Ho avuto un problema simile, in cui avevo bisogno di rimuovere completamente ImageViews dallo schermo. Alcune delle risposte qui mi hanno portato nella giusta direzione, ma alla fine chiamare setImageDrawable () ha funzionato per me:

imgView.setImageDrawable(null);

(Come menzionato nel commento, tale utilizzo è documentato nei documenti ufficiali: ImageView # setImageDrawable .)


3
Funziona in modo affidabile almeno nella mia app. setImageResource (0) funziona a volte, ma non altri.
Hong

5
Se hai impostato l'immagine usando setImageBitmap questo è quello che vuoi
Kevin Parker,

Questa è secondo me la migliore risposta! È pulito, valido e molto corto. Non è necessario definire un disegno vuoto e applicarlo o cose del genere.
Potaito,

Questa risposta funziona davvero in modo affidabile! Ed è il primo post che indica questo codice come soluzione. Quindi ho votato questo e non altri post con la stessa risposta.
L'originale Android

2
Questa risposta è in realtà documentata sui documenti ufficiali: developer.android.com/reference/android/widget/…

79

So che questo è vecchio, ma sono stato in grado di farlo con

viewToUse.setImageResource(0);

Non sembra che dovrebbe funzionare, ma l'ho provato per capriccio, e ha funzionato perfettamente.


2
In realtà, impostarlo su QUALSIASI risorsa di immagine non valida funziona (-1, 45, ecc.)
dvallejo

8
No, l'impostazione su -1 ti dà android.content.res.Resources $ NotFoundException. 0 sembra funzionare.
NateS,

28
Questo caso, quando si scorre la visualizzazione elenco. in qualche modo l'immagine visualizzata che lo imposta come 0 mostrerà l'immagine sbagliata (mostrerà l'immagine da un'altra visione d'immagine) in modo che la risoluzione seguente possa farlo viewToUse.setImageResource (android.R.color.transparent);
Assumi A.Suk il

3
Ho avuto questo errore una volta, quando ho provato questo metodo: "android.content.res.Resources $ NotFoundException: ID risorsa # 0x0", quindi sembra che l'impostazione di un'immagine vuota sia il modo migliore per "cancellare" ImageView
Pavel Alexeev

16

Sembra che ciò che desideri sia un'immagine predefinita su cui impostare ImageView quando non viene visualizzata un'immagine diversa. Ecco come funziona l'applicazione Contatti:

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

67
No, non lo voglio. Voglio solo cancellare il contenuto. L'utente può selezionare una nuova immagine dopo.
Pentium10

3
L'app Contatti è open source ( android.git.kernel.org/?p=platform/packages/apps/… ). Ho studiato il codice sorgente. Si scopre che stanno usando un QuickContactBadge (una sottoclasse di ImageView) e quando non hanno una foto, usano setImageResource per impostare un'immagine predefinita. Controlla com.android.contacts.ContactsListActivity # ContactItemListAdapter per i dettagli, specialmente in getView ().
Dan Lew,

9
Perché hai controllato quella risposta come quella giusta se non è quello che vuoi?
Arniotaki,

3
Daniel Ci possono essere molte ragioni per cui le persone vogliono che l'immagine sia chiara.
K - La tossicità in SO sta crescendo.

1
Non vuole un'immagine predefinita. Vuole che venga cancellato.
EpicPandaForce,

13

Ho provato questo per cancellare Image e DrawableCache in ImageView

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

Spero che questo funzioni per te!


9

Se nessuna di queste soluzioni sta cancellando un'immagine che hai già impostato (in particolare setImageResource(0)o setImageResources(android.R.color.transparent), verifica che l'immagine corrente non sia impostata come sfondo setBackgroundDrawable(...)o qualcosa di simile.

Il tuo codice imposterà la risorsa immagine in primo piano su qualcosa di trasparente di fronte all'immagine di sfondo che hai impostato e mostrerà comunque.


6

Ehi, so di essere in ritardo a questa risposta, ma ho pensato di condividere questo,

Il metodo da chiamare quando ripristini l'immagine deve essere lo stesso metodo che hai chiamato durante l'impostazione.

Quando si desidera ripristinare la fonte immagine @ dennis.sheepard risposta funziona bene solo se stai originariamente impostando l'immagine nella bitmap usandosetImageResource()

per esempio,

avevo usato setImageBitmap()e quindi l'impostazione setImageResource(0)non funzionava, invece ho usato setImageBitmap(null).


1
Hai ragione Ajay, ho osservato lo stesso. Ho usato setImageBitmap () / setImageResource () in alternativa per la stessa visualizzazione dell'immagine a seconda delle condizioni. Quindi ho dovuto usare alternativley setImageResource (0) / setImageBitmap (null) per cancellare l'immagine. Grazie!
Monica M,


3

Sono stato in grado di raggiungere questo obiettivo definendo un disegno (qualcosa come blank_white_shape.xml):

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

Quindi, quando desidero cancellare la visualizzazione dell'immagine, chiamo solo

 imageView.setImage(R.drawable.blank_white_shape);

Questo funziona magnificamente per me!


2

Per l'immagine dell'elemento ListView è possibile impostare ImageView.setVisibility(View.INVISIBLE)o ImageView.setImageBitmap(null)nell'adattatore elenco per il caso "nessuna immagine".


2

Come kwasi ha scritto e modificato il Golu , puoi usare trasparente, anziché bianco:

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>

All'interno di un'attività, vista, ecc.:

view.setImageResource(R.drawable.transparent);

1

Questo funziona per me.

emoji.setBackground(null);

Questo si arresta in modo anomalo in fase di esecuzione.

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

0

Per rimuovere l'immagine in ImageView usare:

title_image.setImageResource(-1);

funziona per me


0

Se usi la libreria di supporto, ottieni AppCompatImageViewinvece ImageView, che supporta setImageResource(0)su tutti i dispositivi, quindi dovresti andare bene usandola allo stesso modo dell'usosetImageDrawable(null) esetImageBitmap(null)

Altrimenti, dovrebbe funzionare bene a partire da alcune versioni di Android. Secondo il codice di Android e secondo i miei test, penso che dovrebbe essere sicuro da usare setImageResource(0)da API API 22 (5.1). Puoi vedere il codice Android di API 22 vs API 21, qui


0

Stavo affrontando lo stesso problema, ho cambiato il colore di sfondo della vista con il colore di sfondo del layout che puoi fare in questo modo:

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

// quindi imposta l'immagine

edit_countflag.setImageResource(R.drawable.flag_id);

0

Ho provato a rimuovere anche l'immagine di ImageView usando ImageView.setImageRessource(0)ma non ha funzionato per me.
Fortunatamente ho ricevuto questo messaggio nei registri:

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

Quindi diciamo, layoutmanagerè la tua istanza per il layout, quindi devi farlo:

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

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

-1

Posso solo sottolineare cosa state tutti cercando di impostare e int dove si aspetta un disegno.

non dovresti fare quanto segue?

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

imageview.setImageDrawable(getApplicationContext().getResources().getDrawable(R.drawable.icon_profile_image));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.