Как очистить ImageView в Android?


277

Я повторно использую ImageViews для своих дисплеев, но в какой-то момент у меня нет значений, чтобы выразить это.

Так как очистить ImageViewAndroid?

Я пробовал:

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

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


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

3
У меня нет изображения по умолчанию, только фон. Мне нужно иметь только фон.
Pentium10

Я думаю, что принятый ответ должен быть изменен здесь. Существуют ли какие-либо условия в стеке потока, чтобы изменить / переместить принятый ответ в реальный ответ (или, что еще лучше, ответ) из «обходного» ответа? Потому что многие пользователи (такие как я) могут пойти на принятый, а не на лучший ответ
Шириш Хервейд

1
@ShirishHerwade хорошо изменилось
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 с экрана. Некоторые ответы здесь привели меня в правильном направлении, но в конечном счете вызов setImageDrawable () сработал для меня:

imgView.setImageDrawable(null);

(Как упомянуто в комментарии, такое использование задокументировано в официальных документах: ImageView # setImageDrawable .)


3
Это работает надежно, по крайней мере, в моем приложении. setImageResource (0) работает иногда, но не другие.
Hong

5
Если вы установили изображение с помощью setImageBitmap, то это то, что вам нужно
Кевин Паркер

Это на мой взгляд лучший ответ! Это чистый, действительный и очень короткий. Не нужно определять пустое рисование и применять его или тому подобное.
Потаито

Этот ответ на самом деле работает надежно! И это самое раннее сообщение о том, что этот код является решением. Поэтому я проголосовал за этот, а не за другие посты с тем же ответом.
Оригинальный 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: Resource ID # 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
Даниэль Может быть много причин, почему люди хотят, чтобы изображение было четким.
К - Токсичность в СО растет.

1
Он не хочет изображения по умолчанию. Он хочет, чтобы это очистили.
EpicPandaForce

13

Я попытался это для очистки Image и DrawableCache в 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, чтобы очистить представление изображения. Спасибо!
Моника М


3

Я смог добиться этого, определив drawable (что-то вроде 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

Я столкнулся с той же проблемой, я изменил цвет фона представления на цвет фона макета, вы можете сделать так:

 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.