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.

Pentium10
fonte
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.

Mario Lenci
fonte
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 .)

Kon
fonte
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.

dennis.sheppard
fonte
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 ...
}
Dan Lew
fonte
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ê !

nandha
fonte
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.

Brad English
fonte
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).

Ajay
fonte
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
5

se você usar o glide, poderá fazê-lo assim.

Glide.with(yourImageView).clear(yourImageView)
Mojtaba Haddadi
fonte
Obrigado refig, ajuda muito.
ucMedia 28/01
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!

kwasi
fonte
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".

Arvis
fonte
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);
KitKat
fonte
1

Isso funciona para mim.

emoji.setBackground(null);

Isso trava no tempo de execução.

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

Para remover a imagem no ImageView, use:

title_image.setImageResource(-1);

funciona para mim

Tobore Igbe
fonte
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

desenvolvedor android
fonte
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);
Syed Danish Haider
fonte
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);
TornaxO7
fonte
-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));
Aaron Newton
fonte