Jak wyczyścić ImageView w Androidzie?

277

Ponownie używam ImageViews do moich wyświetlaczy, ale w pewnym momencie nie mam wartości, aby je umieścić.

Jak wyczyścić system ImageViewAndroid?

Próbowałem:

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

Żadne z nich nie wyczyściło widoku, nadal pokazuje poprzednie zdjęcie.

Pentium10
źródło
1
Sugeruję załadować domyślny obraz, gdy nie masz wartości.
Praveen,
3
Nie mam domyślnego obrazu, tylko tło. Muszę mieć tylko tło.
Pentium
Myślę, że tutaj należy zmienić zaakceptowaną odpowiedź. Czy istnieje przepis dotyczący przepływu stosu, aby zmienić / przenieść zaakceptowaną odpowiedź do rzeczywistej odpowiedzi (lub lepszej odpowiedzi) z odpowiedzi „obejścia”? Ponieważ wielu użytkowników (takich jak ja) może zaakceptować, a nie lepszą odpowiedź
Shirish Herwade,
1
@ShirishHerwade ok zmienione
Pentium10
Miałem do czynienia z tym samym problemem, robię to w ten sposób: stackoverflow.com/a/50448536/5697474
Syed Danish Haider

Odpowiedzi:

540

Robiłem to z rozwiązaniem dennis.sheppard :

viewToUse.setImageResource(0);

działa, ale nie jest udokumentowane, więc nie jest tak naprawdę jasne, czy wpływa na coś innego w widoku (możesz sprawdzić kod ImageView, jeśli chcesz, nie zrobiłem tego).

Myślę, że najlepszym rozwiązaniem jest:

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

Najbardziej podoba mi się to rozwiązanie, ponieważ nie ma nic trudnego w przywróceniu stanu, a także jasne jest, co robi.

Mario Lenci
źródło
3
Myślę, że użycie setImageResource z identyfikatorem koloru spowoduje awarie problemów na Androidzie 2.2.1
Blundell
2
dla mnie działa viewToUse.setImageResource (android.R.color.transparent); kod
Javier
3
strzeż się tego, jeśli faktycznie masz zasób o identyfikatorze 0, wpłynie to na zestaw, który można wyciągnąć jako widok twojego maga. Nie jestem jednak pewien, jakie są szanse na to, że będzie to dowód osobisty ...
Chris
1
Miałem problemy z setImageResource (0) - nie zawsze działało. Ale ustawienie przezroczystości jest bardzo niezawodne. Dzięki!
Scott Biggs,
6
viewToUse.setImageResource(0);nie działa, ale viewToUse.setImageResource(android.R.color.transparent);działało.
zionpi
119

Miałem podobny problem, w którym musiałem całkowicie usunąć ImageViews z ekranu. Niektóre odpowiedzi tutaj poprowadziły mnie we właściwym kierunku, ale ostatecznie wywołanie setImageDrawable () zadziałało dla mnie:

imgView.setImageDrawable(null);

(Jak wspomniano w komentarzu, takie użycie jest udokumentowane w oficjalnych dokumentach: ImageView # setImageDrawable .)

Kon
źródło
3
Działa to niezawodnie przynajmniej w mojej aplikacji. setImageResource (0) działa czasami, ale nie inne.
Hong
5
Jeśli ustawiłeś obraz za pomocą setImageBitmap, właśnie tego chcesz
Kevin Parker
To moim zdaniem najlepsza odpowiedź! Jest czysty, ważny i bardzo krótki. Nie ma potrzeby definiowania pustego rysunku i zastosowania go lub czegoś takiego.
Potaito,
Ta odpowiedź działa naprawdę niezawodnie! Jest to najwcześniejszy post podający ten kod jako rozwiązanie. Dlatego głosowałem za tym, a nie za innymi postami z tą samą odpowiedzią.
Oryginalny Android
2
Ta odpowiedź jest faktycznie udokumentowana w oficjalnych dokumentach: developer.android.com/reference/android/widget/…
79

Wiem, że to stare, ale udało mi się to osiągnąć

viewToUse.setImageResource(0);

Nie wydaje się, żeby to działało, ale wypróbowałem go pod wpływem kaprysu i działało idealnie.

dennis.sheppard
źródło
2
Właściwie ustawienie na KAŻDY nieprawidłowy zasób obrazu działa (-1, 45 itd.)
dvallejo
8
Nie, ustawienie -1 daje android.content.res.Resources $ NotFoundException. 0 wydaje się działać.
NateS
28
Ten przypadek podczas przewijania widoku listy. w jakiś sposób widok obrazu, który ustawił go na 0, pokaże zły obraz (pokaże obraz z innego podglądu obrazu), więc poniższa rozdzielczość może to zrobić viewToUse.setImageResource (android.R.color.transparent);
Sruit A.Suk
3
Wystąpił ten błąd raz, gdy wypróbowałem tę metodę: „android.content.res.Resources $ NotFoundException: Identyfikator zasobu # 0x0”, więc wydaje się, że ustawienie pustego obrazu jest najlepszym sposobem na „wyczyszczenie” ImageView
Pavel Alexeev
16

Wygląda na to, że to, czego chcesz, to domyślny obraz, na który ustawiasz ImageView, gdy nie wyświetla innego obrazu. W ten sposób robi to aplikacja Kontakty:

if (photoId == 0) {
    viewToUse.setImageResource(R.drawable.ic_contact_list_picture);
} else {
    // ... here is where they set an actual image ...
}
Dan Lew
źródło
67
Nie, nie chcę tego. Chcę tylko wyczyścić zawartość. Użytkownik może wybrać nowy obraz po.
Pentium
3
Aplikacja Kontakty jest oprogramowaniem typu open source ( android.git.kernel.org/?p=platform/packages/apps/… ). Sprawdziłem kod źródłowy. Okazuje się, że używają QuickContactBadge (podklasy ImageView), a gdy nie mają zdjęcia, używają setImageResource, aby ustawić domyślny obraz. Sprawdź szczegóły com.android.contacts.ContactsListActivity # ContactItemListAdapter, szczególnie w getView ().
Dan Lew
9
Dlaczego sprawdziłeś tę odpowiedź jako właściwą, jeśli nie jest to, czego chcesz?
arniotaki,
3
Daniel Może istnieć wiele powodów, dla których ludzie chcą, aby obraz był wyraźny.
K - Toksyczność w SO rośnie.
1
Nie chce domyślnego obrazu. Chce, żeby to zostało wyjaśnione.
EpicPandaForce
13

Próbowałem tego, aby wyczyścić Image i DrawableCache w ImageView

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

Mam nadzieję, że to zadziała dla Ciebie!

nandha
źródło
9

Jeśli żadne z tych rozwiązań nie usuwa obrazu, który już ustawiłeś (szczególnie setImageResource(0)lub setImageResources(android.R.color.transparent)sprawdź, czy bieżący obraz nie jest ustawiony jako tło za pomocąsetBackgroundDrawable(...) lub coś podobnego.

Twój kod po prostu ustawi zasób obrazu na pierwszym planie na coś przezroczystego przed ustawionym obrazem tła i nadal będzie się wyświetlać.

Brad English
źródło
6

Hej, wiem, że jestem bardzo spóźniony na tę odpowiedź, ale pomyślałem, że muszę się tym podzielić,

Metodą wywoływania przy resetowaniu obrazu musi być ta sama metoda, którą wywoływałeś podczas ustawiania go.

Kiedy chcesz zresetować źródło obrazu @ dennis.sheepard odpowiedź działa poprawnie tylko wtedy, gdy pierwotnie ustawiasz obraz w bitowej za pomocąsetImageResource()

na przykład,

Użyłem setImageBitmap()i dlatego ustawienie nie setImageResource(0)działa, zamiast tego użyłem setImageBitmap(null).

Ajay
źródło
1
Masz rację Ajay, zaobserwowałem to samo. Użyłem setImageBitmap () / setImageResource () alternatywnie do tego samego obrazu w zależności od warunków. Dlatego musiałem użyć alternatywnie setImageResource (0) / setImageBitmap (null), aby wyczyścić widok obrazu. Dzięki!
Monica M
5

jeśli użyjesz poślizgu, możesz to zrobić w ten sposób.

Glide.with(yourImageView).clear(yourImageView)
Mojtaba Haddadi
źródło
Dzięki refig, pomaga dużo.
ucMedia
3

Byłem w stanie to osiągnąć, definiując dający się rysować (coś takiego jak blank_white_shape.xml):

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

Potem, gdy chcę wyczyścić widok obrazu, po prostu dzwonię

 imageView.setImage(R.drawable.blank_white_shape);

To działa dla mnie pięknie!

kwasi
źródło
2

W przypadku obrazu elementu ListView można ustawić ImageView.setVisibility(View.INVISIBLE)lub ImageView.setImageBitmap(null)w adapterze listy dla przypadku „brak obrazu”.

Arvis
źródło
2

Jak napisał kwasi i pod redakcją golu , możesz użyć przezroczystego zamiast białego:

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

Wewnątrz działania, widoku itp .:

view.setImageResource(R.drawable.transparent);
KitKat
źródło
1

To działa dla mnie.

emoji.setBackground(null);

To ulega awarii w czasie wykonywania.

viewToUse.setImageResource(android.R.color.transparent);  
sbchitra
źródło
0

Aby usunąć obraz w ImageView użyj:

title_image.setImageResource(-1);

działa dla mnie

Tobore Igbe
źródło
0

Jeśli korzystasz z biblioteki wsparcia, dostajesz AppCompatImageViewzamiast tego ImageView, który obsługuje setImageResource(0)na wszystkich urządzeniach, więc powinieneś być w stanie używać go w taki sam sposób, jak przy użyciusetImageDrawable(null) isetImageBitmap(null)

W przeciwnym razie powinien działać poprawnie, zaczynając od wersji Androida. Zgodnie z kodem Androida i zgodnie z moimi testami, myślę, że powinien być bezpieczny w użyciu setImageResource(0)z Android API 22 (5.1). Możesz zobaczyć kod Androida API 22 vs API 21 tutaj

programista Androida
źródło
0

Napotkałem ten sam problem, zmieniłem kolor tła widoku na kolor tła układu, możesz to zrobić w następujący sposób:

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

// następnie ustaw obraz

edit_countflag.setImageResource(R.drawable.flag_id);
Syed Danish Haider
źródło
0

Próbowałem też usunąć Image ImageView przy użyciu, ImageView.setImageRessource(0)ale to nie działało dla mnie.
Na szczęście dostałem tę wiadomość w dziennikach:

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

Powiedzmy, że layoutmanagermasz instancję układu, niż musisz to zrobić:

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

// this line worked for me
layoutManager.removeView(image);
TornaxO7
źródło
-1

Czy mogę po prostu wskazać, co wszyscy staracie się ustalić, i gdzie jest to oczekiwane.

nie powinieneś robić następujących rzeczy?

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

imageview.setImageDrawable(getApplicationContext().getResources().getDrawable(R.drawable.icon_profile_image));
Aaron Newton
źródło