Як очистити ImageView в Android?


277

Я повторно використовую ImageViews для своїх дисплеїв, але в якийсь момент у мене немає значень, щоб його поставити.

Тож як очистити ImageViewандроїд?

Я спробував:

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

Жодна з них не очистила подання, воно все ще показує попереднє зображення.


1
Я пропоную завантажити зображення за замовчуванням, коли у вас немає значення.
Praveen

3
У мене немає зображення за замовчуванням, просто фон. Мені потрібно мати лише тло.
Pentium10

Я думаю, що тут слід змінити прийняту відповідь. Чи є положення про stackoverflow для зміни / переміщення прийнятої відповіді на фактичну відповідь (або більш кращу відповідь) з відповіді "обхідний шлях"? Тому що багато користувачів (як я) можуть піти на прийняту, а не кращу відповідь
Shirish Herwade

1
@ShirishHerwade ok змінився
Pentium10

Я зіткнувся з тим же питанням, я роблю це так: stackoverflow.com/a/50448536/5697474
Syed Danish Haider

Відповіді:


540

Раніше я робив це з рішенням dennis.sheppard :

viewToUse.setImageResource(0);

це працює, але це не задокументовано, тому не зовсім зрозуміло, чи впливає щось інше на представлення (ви можете перевірити код ImageView, якщо хочете, я цього не зробив).

Я думаю, що найкраще рішення:

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

Мені подобається це рішення, бо найбільше не існує нічого складного в поверненні стану, і також зрозуміло, що це робить.


3
Я думаю, що використання setImageResource з кольоровим ідентифікатором дасть вам кращі проблеми на Android 2.2.1
Blundell

2
для мене працює viewToUse.setImageResource (android.R.color.transparent); код
Хав'єр

3
будьте обачні, якщо у вас фактично є ресурс з ідентифікатором 0, це призведе до встановлення фактів, які можна використовувати як перегляд вашої карти. Не впевнений, які шанси мати це як ідентифікатор ..
Кріс,

1
У мене виникли проблеми із setImageResource (0) - не завжди працював. Але встановити його прозорим дуже надійно. Дякую!
Скотт Біггс

6
viewToUse.setImageResource(0);не працює, але viewToUse.setImageResource(android.R.color.transparent);працював.
zionpi

119

У мене була подібна проблема, коли мені потрібно було повністю видалити ImageViews з екрану повністю. Деякі відповіді тут привели мене в правильному напрямку, але в кінцевому підсумку виклик setImageDravable () працював на мене:

imgView.setImageDrawable(null);

(Як зазначено в коментарі, таке використання зафіксовано в офіційних документах: ImageView # setImageDravable .)


3
Це надійно працює принаймні в моєму додатку. setImageResource (0) працює іноді, але не інші.
Гонг

5
Якщо ви встановили зображення за допомогою setImageBitmap, це те, що ви хочете
Кевін Паркер

Це, на мій погляд, найкраща відповідь! Це чисто, дійсно і дуже коротко. Не потрібно визначати порожній малюнок і застосовувати його або подібні речі.
Potaito

Ця відповідь насправді працює надійно! І це самий ранній пост із зазначенням цього коду як рішення. Отже, я підтримував цю, а не іншу посаду з тією ж відповіддю.
Оригінальний Android

2
Ця відповідь фактично задокументована в офіційних документах: developer.android.com/reference/android/widget/…

79

Я знаю, що це по-старому, але мені вдалося це досягти

viewToUse.setImageResource(0);

Здається, це не повинно працювати, але я спробував це на примху, і це спрацювало чудово.


2
Насправді, встановивши її на БУДЬ-яку недійсну роботу ресурсу зображення (-1, 45 тощо)
dvallejo

8
Ні, встановлення значення -1 дає вам android.content.res.Resources $ NotFoundException. 0, здається, працює.
NateS

28
Цей випадок, коли ви прокручуєте перегляд списку. якимось чином перегляд зображень, який встановив його як 0, покаже неправильне зображення (воно покаже зображення з іншого перегляду зображень), тому роздільна здатність нижче може зробити це viewToUse.setImageResource (android.R.color.transparent);
Sruit A.Suk

3
Цю помилку я отримав один раз при спробі цього методу: "android.content.res.Resources $ NotFoundException: Ідентифікатор ресурсу # 0x0", тому здається, що встановлення порожнього зображення є найкращим способом "очистити" ImageView
Павло Алексєєв

16

Це звучить як те, що ви хочете - це зображення за замовчуванням, щоб встановити ImageView, коли воно не відображає інше зображення. Ось як це робить додаток "Контакти":

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

67
Ні, я цього не хочу. Я хочу просто очистити вміст. Користувач може вибрати нове зображення після.
Pentium10

3
Додаток "Контакти" є відкритим кодом ( android.git.kernel.org/?p=platform/packages/apps/… ). Я досліджував вихідний код. Виявляється, вони використовують QuickContactBadge (підклас ImageView), а коли у них немає фотографії, вони використовують setImageResource для встановлення зображення за замовчуванням. Перевірте інформацію про com.android.contacts.ContactsListActivity # ContactItemListAdapter, особливо в getView ().
Ден Лев

9
Чому ти перевірив цю відповідь як правильну, якщо вона не є тим, що ти хочеш?
арніотакі

3
Даніель Причин, чому люди хочуть, щоб зображення було зрозумілим, може бути багато.
K - Токсичність в SO зростає.

1
Він не хоче зображення за замовчуванням. Він хоче, щоб це було очищено.
EpicPandaForce

13

Я спробував це для очищення Image and DravableCache у ImageView

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

Я сподіваюся, що це працює для вас!


9

Якщо жодне з цих рішень не очищає зображення, яке ви вже встановили (особливо, setImageResource(0)або setImageResources(android.R.color.transparent)перевірте, чи поточне зображення не встановлено як фонове зображення setBackgroundDrawable(...)чи щось подібне).

Ваш код просто встановить ресурс зображення на передньому плані на щось прозоре перед тим фоновим зображенням, яке ви встановили, і все ще відображатиметься.


6

Гей, я знаю, що я надзвичайно пізно на цю відповідь, але я просто подумав, що я повинен поділитися цим,

Метод виклику, коли ви скидаєте зображення, повинен бути тим самим методом, який ви викликали, коли ви встановлювали його.

Коли ви хочете скинути джерело зображення @ dennis.sheepard, відповідь працює добре, лише якщо ви спочатку встановлюєте зображення в растровій карті за допомогоюsetImageResource()

наприклад,

я використовував setImageBitmap()і, отже, налаштування setImageResource(0)не працювало, замість цього я використовував setImageBitmap(null).


1
Ти прав, Адже, я це спостерігав. Я використовував setImageBitmap () / setImageResource () альтернативно для того ж перегляду зображень залежно від умов. Отже, мені довелося використовувати setImageResource (0) / setImageBitmap (null) alternativley, щоб очистити зображення. Дякую!
Моніка М

5

якщо ви використовуєте glide, ви можете зробити це так.

Glide.with(yourImageView).clear(yourImageView)

Спасибі рефіг, це допомагає багато.
ucMedia

3

Мені вдалося досягти цього, визначивши малюнок (щось на зразок blank_white_shape.xml):

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

Потім, коли я хочу очистити зображення, я просто зателефонував

 imageView.setImage(R.drawable.blank_white_shape);

Це прекрасно працює для мене!


2

Для зображення елемента елемента ListView ви можете встановити ImageView.setVisibility(View.INVISIBLE)або ImageView.setImageBitmap(null)в списку адаптера для випадку "без зображення".


2

Як Kwasi писав і Golu відредагований, ви можете використовувати прозорий, а НЕ білий:

Файл 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>

Всередині діяльності, перегляду тощо:

view.setImageResource(R.drawable.transparent);

1

Це працює для мене.

emoji.setBackground(null);

Це збоїв у процесі виконання.

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

0

Щоб видалити зображення у ImageView, використовуйте:

title_image.setImageResource(-1);

воно працює для мене


0

Якщо ви використовуєте бібліотеку підтримки, ви отримаєте AppCompatImageViewзамість того ImageView, що підтримує setImageResource(0)на всіх пристроях, тому вам слід добре використовувати її так само, як setImageDrawable(null)іsetImageBitmap(null)

В іншому випадку це має справно працювати, починаючи з якоїсь версії Android. Відповідно до коду Android та згідно з моїми тестами, я думаю, це слід безпечно використовувати setImageResource(0)з Android API 22 (5.1). Код Android API 22 проти API 21 ви можете переглянути тут


0

Я зіткнувся з тією ж проблемою, я змінив колір тла перегляду на колір тла макета u може зробити так:

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

// потім встановіть зображення

edit_countflag.setImageResource(R.drawable.flag_id);

0

Я спробував видалити Зображення ImageView також за допомогою, ImageView.setImageRessource(0)але це не спрацювало.
На щастя, я отримав це повідомлення в журналах:

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

Отже, скажімо, чи layoutmanagerє ваш екземпляр для макета, ніж вам потрібно це зробити:

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

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

-1

Чи можу я просто вказати на те, що ви все намагаєтесь встановити, і про те, де його очікують, що це можливо.

ви не повинні робити наступне?

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

imageview.setImageDrawable(getApplicationContext().getResources().getDrawable(R.drawable.icon_profile_image));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.