Como limpar um ImageView no Android?


277

Estou reutilizando ImageViews para meus monitores, mas em algum momento não tenho valores para colocá-lo.

Então, como limpar um ImageViewno Android?

Eu tentei:

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

Nenhum deles limpou a visualização, ainda mostra a imagem anterior.


1
Eu sugiro carregar a imagem padrão quando você não tem valor.
Praveen

3
Não tenho imagem padrão, apenas um plano de fundo. Eu preciso ter apenas o fundo.
Pentium10

Acho que a resposta aceita precisa ser alterada aqui. Existe alguma disposição no stackoverflow para alterar / mover resposta aceita para resposta real (ou resposta melhor) de uma resposta 'alternativa'? Porque muitos usuários (como eu) pode ir para aceito em vez de resposta melhor
Shirish Herwade

1
@ShirishHerwade ok mudou
Pentium10

Eu estava enfrentando o mesmo problema i fazê-lo como este: stackoverflow.com/a/50448536/5697474
Syed Haider dinamarquês

Respostas:


540

Eu costumava fazer isso com a solução dennis.sheppard :

viewToUse.setImageResource(0);

funciona, mas não está documentado, portanto não está claro se isso afeta outra coisa na exibição (você pode verificar o código ImageView, se quiser, não o fiz).

Eu acho que a melhor solução é:

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

Gosto mais desta solução porque não há nada de complicado em reverter o estado e também está claro o que está fazendo.


3
Acho que usando setImageResource com um identificador de cor lhe dará questões quebrando na Android 2.2.1
Blundell

2
para mim trabalha o viewToUse.setImageResource (android.R.color.transparent); código
Javier

3
cuidado com isso, se você realmente tiver um recurso com um ID igual a 0, isso afetará o conjunto que pode ser extraído como sua visualização de dano. Não tenho certeza quais são as chances de ter isso como um id embora ..
Chris

1
Eu tive problemas com o setImageResource (0) - nem sempre funcionava. Mas configurá-lo para transparente é muito confiável. Obrigado!
Scott Biggs

6
viewToUse.setImageResource(0);não funcionou, mas viewToUse.setImageResource(android.R.color.transparent);funcionou.
Zionpi 4/15

119

Eu tive um problema semelhante, onde eu precisava basicamente remover completamente o ImageViews da tela. Algumas das respostas aqui me levaram na direção certa, mas finalmente chamar setImageDrawable () funcionou para mim:

imgView.setImageDrawable(null);

(Conforme mencionado no comentário, esse uso está documentado nos documentos oficiais: ImageView # setImageDrawable .)


3
Isso funciona de maneira confiável, pelo menos no meu aplicativo. setImageResource (0) funciona algumas vezes, mas não outras.
Hong

5
Se tiver definido a imagem usando setImageBitmap este é o que você quer
Kevin Parker

Esta é na minha opinião a melhor resposta! É limpo, válido e muito curto. Não há necessidade de definir um drawable em branco e aplicá-lo ou coisas assim.
Potaito 10/03/2015

Esta resposta realmente funciona de forma confiável! E é o primeiro post afirmando esse código como uma solução. Por isso, votei este em um voto positivo e não em outros posts com a mesma resposta.
O Android original

2
Esta resposta está realmente documentada nos documentos oficiais: developer.android.com/reference/android/widget/…

79

Sei que isso é antigo, mas consegui fazer isso com

viewToUse.setImageResource(0);

Parece que não deve funcionar, mas tentei por um capricho e funcionou perfeitamente.


2
Na verdade, definindo-o como quaisquer trabalhos inválidos recursos de imagem (-1, 45, etc)
dvallejo

8
Não, a configuração de -1 fornece android.content.res.Resources $ NotFoundException. 0 parece funcionar.
NateS

28
Nesse caso, quando você rola sua lista. de alguma forma, a visualização de imagem que o definiu como 0 mostrará a imagem errada (mostrará a imagem de outra visualização de imagem) para que a resolução abaixo possa visualizá-la. viewToUse.setImageResource (android.R.color.transparent);
Sruit A.Suk

3
Eu recebi esse erro uma vez, ao tentar este método: "android.content.res.Resources $ NotFoundException: Resource ID # 0x0", então parece que definir uma imagem vazia é a melhor maneira de "limpar" o ImageView
Pavel Alexeev

16

Parece que o que você deseja é uma imagem padrão para definir o ImageView quando não estiver exibindo uma imagem diferente. É assim que o aplicativo Contatos faz isso:

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

67
Não, eu não quero isso. Eu quero apenas limpar o conteúdo. O usuário pode selecionar uma nova imagem depois.
Pentium10

3
O aplicativo Contatos é de código aberto ( android.git.kernel.org/?p=platform/packages/apps/… ). Eu investiguei o código fonte. Acontece que eles estão usando um QuickContactBadge (uma subclasse do ImageView) e, quando não têm uma foto, usam setImageResource para definir uma imagem padrão. Verifique com.android.contacts.ContactsListActivity # ContactItemListAdapter para obter detalhes, especialmente em getView ().
Dan Lew

9
Por que você marcou essa resposta como a correta, se não é o que você deseja?
Arnotaki

3
Daniel Pode haver muitas razões pelas quais as pessoas desejam a imagem clara.
K - A toxicidade no SO está crescendo.

1
Ele não quer uma imagem padrão. Ele quer que seja limpo.
EpicPandaForce 27/07

13

Eu tentei isso para limpar Image e DrawableCache no ImageView

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

Espero que isso funcione pra você !


9

Se nenhuma dessas soluções estiver limpando uma imagem que você já definiu (especialmente setImageResource(0)ou setImageResources(android.R.color.transparent), verifique se a imagem atual não está definida como segundo plano setBackgroundDrawable(...)ou algo semelhante).

Seu código apenas definirá o recurso de imagem em primeiro plano como algo transparente na frente da imagem de plano de fundo que você definiu e ainda será exibida.


6

Ei, eu sei que estou extremamente atrasado para esta resposta, mas pensei em compartilhar isso,

O método a ser chamado quando você redefinir a imagem deve ser o mesmo método que você chamou enquanto a definia.

Quando você deseja redefinir a fonte da imagem, a resposta @ dennis.sheepard funciona bem apenas se você estiver configurando a imagem originalmente no bitmap usandosetImageResource()

por exemplo,

eu tinha usado setImageBitmap()e, portanto, a configuração setImageResource(0)não funcionou, em vez disso, usei setImageBitmap(null).


1
Você está certo, Ajay, observei o mesmo. Usei setImageBitmap () / setImageResource () como alternativa para a mesma visualização de imagem, dependendo das condições. Portanto, tive que usar a alternativa setImageResource (0) / setImageBitmap (null) para limpar a visualização de imagem. Obrigado!
Monica M


3

Consegui fazer isso definindo um drawable (algo como blank_white_shape.xml):

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

Então, quando eu quero limpar a visualização da imagem, eu chamo

 imageView.setImage(R.drawable.blank_white_shape);

Isso funciona lindamente para mim!


2

Para a imagem do item do ListView, você pode definir ImageView.setVisibility(View.INVISIBLE)ou ImageView.setImageBitmap(null)no adaptador de lista o caso "sem imagem".


2

Como o kwasi escreveu e o golu editou, você pode usar transparente, em vez de branco:

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

Dentro de uma atividade, visão, etc:

view.setImageResource(R.drawable.transparent);

1

Isso funciona para mim.

emoji.setBackground(null);

Isso trava no tempo de execução.

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

0

Para remover a imagem no ImageView, use:

title_image.setImageResource(-1);

funciona para mim


0

Se você usa a biblioteca de suporte, obtém, em AppCompatImageViewvez de ImageView, o que é compatível setImageResource(0)com todos os dispositivos, portanto você deve usá-lo da mesma maneira que usa setImageDrawable(null)esetImageBitmap(null)

Caso contrário, deve funcionar bem a partir de uma versão do Android. De acordo com o código do Android e de acordo com meus testes, acho que deve ser seguro usar a setImageResource(0)API Android 22 (5.1). Você pode ver o código Android da API 22 vs API 21, aqui


0

Eu estava enfrentando o mesmo problema, mudei a cor de fundo da exibição para a cor de fundo do layout que você pode fazer assim:

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

// depois defina a imagem

edit_countflag.setImageResource(R.drawable.flag_id);

0

Tentei remover a imagem do ImageView também, ImageView.setImageRessource(0)mas não funcionou para mim.
Felizmente, recebi esta mensagem nos logs:

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

Então, digamos, layoutmanageré sua instância para o layout, do que você precisa fazer isso:

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

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

-1

Posso apenas apontar o que todos vocês estão tentando definir e int onde está esperando um drawable.

você não deveria estar fazendo o seguinte?

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

imageview.setImageDrawable(getApplicationContext().getResources().getDrawable(R.drawable.icon_profile_image));
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.