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

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

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

Я пробовал:

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

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


person Pentium10    schedule 18.05.2010    source источник
comment
я предлагаю загрузить изображение по умолчанию, когда у вас нет значения.   -  person Praveen    schedule 18.05.2010
comment
У меня нет изображения по умолчанию, только фон. Мне нужен только фон.   -  person Pentium10    schedule 18.05.2010
comment
Я думаю, что принятый ответ нужно изменить здесь. Есть ли какое-либо положение в stackoverflow для изменения/перемещения принятого ответа на фактический ответ (или более лучший ответ) из «обходного» ответа? Потому что многие пользователи (такие как я) могут выбрать принятый, а не лучший ответ.   -  person Shirish Herwade    schedule 09.12.2015
comment
@ShirishHerwade, хорошо, изменено   -  person Pentium10    schedule 10.12.2015
comment
Я столкнулся с той же проблемой, я делаю это так: stackoverflow.com/a/50448536/5697474   -  person Syed Danish Haider    schedule 21.05.2018
comment
Я бы просто создал ресурс изображения по умолчанию и в операторе if, где изображение должно быть установлено в первую очередь, я бы просто написал следующее в предложении else: imageView.setImageResource(R.drawable.default_resource. jpg);   -  person goldenmaza    schedule 16.01.2019


Ответы (18)


Раньше я делал это с помощью решения dennis.sheppard:

viewToUse.setImageResource(0);

он работает, но не задокументирован, поэтому не совсем ясно, влияет ли он на что-то еще в представлении (вы можете проверить код ImageView, если хотите, я нет).

Я думаю, что лучшее решение:

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

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

person Mario Lenci    schedule 23.11.2011
comment
Я думаю, что использование setImageResource с идентификатором цвета приведет к сбою на Android 2.2.1. - person Blundell; 15.08.2012
comment
это возможно. У меня нет устройства, чтобы проверить это. ты проверял это? на всякий случай напишите здесь, и я отредактирую ответ (и мой код :)). Я протестировал его на xperia U20i с обновлением 2.11 и работает, как и ожидалось. - person Mario Lenci; 19.09.2012
comment
для меня работает viewToUse.setImageResource(android.R.color.transparent); код - person Javier; 09.01.2013
comment
Это не сработает, если вы установили drawable вместо uri или ресурса. - person pablisco; 23.04.2014
comment
ты про первое решение? Это возможно, но я уверен, что второе решение работает в каждом случае. - person Mario Lenci; 23.04.2014
comment
остерегайтесь этого, если у вас действительно есть ресурс с идентификатором 0, это на самом деле установит этот рисунок как вид вашего изображения. Не уверен, каковы шансы иметь это как идентификатор. - person Chris; 12.09.2014
comment
У меня были проблемы с setImageResource(0) - не всегда работало. Но установка его на прозрачность очень надежна. Спасибо! - person SMBiggs; 18.09.2014
comment
viewToUse.setImageResource(0); не сработало, а viewToUse.setImageResource(android.R.color.transparent); сработало. - person zionpi; 04.05.2015
comment
Если вы пытаетесь очистить фоновые изображения вместо src, используйте viewToUse.setBackgroundResource(android.R.color.transparent); - person Raj; 08.10.2015
comment
Да, не используйте трюк с 0 - иногда Android ищет ресурс с идентификатором 0, а затем взрывается. Как ни странно, это случайное поведение, поэтому его трудно заметить. - person slott; 27.10.2015
comment
Установка прозрачного фона может привести к перерисовке. рендерятся даже прозрачные пиксели - person Nativ; 11.09.2016
comment
У меня не сработало внутри ListView Попробуйте это image.setImageBitmap(null); - person Zain; 28.12.2016
comment
Что касается viewToUse.setImageResource(0) , это должно работать, только если вы используете библиотеку поддержки (которая автоматически дает вам AppCompatImageView вместо ImageView) или если вы используете Android 5.1 (API 22) и выше. Я писал об этом здесь: stackoverflow.com/a/50100342/878126 - person android developer; 30.04.2018
comment
viewToUse.setImageResource(0) не работает на Kitkat, но работает на более высоких версиях Android - person Suraj; 27.08.2019

У меня была аналогичная проблема, когда мне нужно было полностью удалить ImageViews с экрана. Некоторые из ответов здесь привели меня в правильном направлении, но в конечном итоге вызов setImageDrawable() сработал для меня:

imgView.setImageDrawable(null);

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

person Kon    schedule 09.04.2011
comment
Это надежно работает, по крайней мере, в моем приложении. setImageResource(0) иногда работает, но не всегда. - person Hong; 03.04.2013
comment
Если вы установили изображение с помощью setImageBitmap, это то, что вам нужно - person Kevin Parker; 15.05.2013
comment
На мой взгляд это лучший ответ! Он чистый, действительный и очень короткий. Не нужно определять пустой рисунок и применять его или что-то в этом роде. - person Potaito; 10.03.2015
comment
Этот ответ действительно работает надежно! И это самый ранний пост, в котором этот код указан как решение. Поэтому я проголосовал за этот, а не за другие посты с тем же ответом. - person The Original Android; 05.07.2015
comment
У меня это не сработало на Android M. Мне пришлось установить View как невидимый. - person likejudo; 16.12.2015
comment
Этот ответ фактически задокументирован в официальных документах: developer.android.com/reference/android/widget/ - person ; 01.02.2018

Я знаю, что это старо, но я смог сделать это с помощью

viewToUse.setImageResource(0);

Кажется, это не должно работать, но я попробовал это по прихоти, и это сработало отлично.

person dennis.sheppard    schedule 01.11.2010
comment
На самом деле, установка его на ЛЮБОЙ недопустимый ресурс изображения работает (-1, 45 и т. д.) - person dvallejo; 01.03.2011
comment
Нет, установка значения -1 дает вам android.content.res.Resources$NotFoundException. 0 вроде работает. - person NateS; 10.04.2011
comment
Этот случай, когда вы прокручиваете свой список. каким-то образом изображение, которое установило его как 0, покажет неправильное изображение (оно покажет изображение из другого изображения), поэтому разрешение ниже может сделать это viewToUse.setImageResource(android.R.color.transparent); - person Sruit A.Suk; 15.07.2012
comment
Я получил эту ошибку один раз при попытке использовать этот метод: android.content.res.Resources$NotFoundException: идентификатор ресурса #0x0, поэтому кажется, что установка пустого изображения - лучший способ очистить ImageView - person Pavel Alexeev; 12.04.2013

Похоже, вам нужно изображение по умолчанию для установки вашего ImageView, когда оно не отображает другое изображение. Вот как это делает приложение «Контакты»:

if (photoId == 0) {
    viewToUse.setImageResource(R.drawable.ic_contact_list_picture);
} else {
    // ... here is where they set an actual image ...
}
person Dan Lew    schedule 18.05.2010
comment
Нет, я не хочу этого. Я хочу просто очистить содержимое. Пользователь может выбрать новое изображение после. - person Pentium10; 18.05.2010
comment
Я не понимаю тогда. Вы не хотите, чтобы отображалось какое-либо изображение, но у вас нет изображения по умолчанию, которое будет отображаться пользователю, когда изображение не отображается. Вы либо делаете что-то, что хотите показать пользователю, либо нет. Вы можете даже установить фон как ресурс изображения. - person Dan Lew; 18.05.2010
comment
Если вы знакомы с контактами, есть заменитель фоновой рамки карточки контакта, он есть в моем коде. <ImageView android:id="@+id/photo" android:layout_width="54dip" android:layout_height="57dip" android:layout_marginLeft="0dip" android:background="@drawable/quickcontact_photo_frame" /> Это простой серый фон, на котором находится фотография. - person Pentium10; 18.05.2010
comment
Приложение «Контакты» имеет открытый исходный код (android. git.kernel.org/?p=platform/packages/apps/). Я исследовал исходный код. Оказывается, они используют QuickContactBadge (подкласс ImageView), а когда у них нет фотографии, они используют setImageResource для установки изображения по умолчанию. Подробности смотрите в com.android.contacts.ContactsListActivity#ContactItemListAdapter, особенно в getView(). - person Dan Lew; 18.05.2010
comment
Почему вы отметили этот ответ как правильный, если это не то, что вам нужно? - person arniotaki; 14.11.2014
comment
Дэниел Может быть много причин, по которым люди хотят, чтобы изображение было четким. - person basickarl; 12.03.2015
comment
Он не хочет изображения по умолчанию. Он хочет, чтобы это было очищено. - person EpicPandaForce; 27.07.2016

Я пробовал это, чтобы очистить изображение и DrawableCache в ImageView

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

Я надеюсь, что это работает для вас!

person nandha    schedule 13.09.2013

Если ни одно из этих решений не очищает изображение, которое вы уже установили (особенно setImageResource(0) или setImageResources(android.R.color.transparent)), убедитесь, что текущее изображение не установлено в качестве фона, используя setBackgroundDrawable(...) или что-то подобное.

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

person Brad English    schedule 01.06.2014

если вы используете скольжение, вы можете сделать это так.

Glide.with(yourImageView).clear(yourImageView)
person Mojtaba Haddadi    schedule 08.12.2019
comment
Спасибо, рефиг, очень помогает. - person ucMedia; 28.01.2020

Эй, я знаю, что очень опаздываю с этим ответом, но просто подумал, что должен поделиться этим,

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

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

например,

я использовал setImageBitmap() и, следовательно, настройка setImageResource(0) не работала, вместо этого я использовал setImageBitmap(null).

person Ajay    schedule 31.01.2013
comment
Ты прав, Аджай, я наблюдал то же самое. Я использовал setImageBitmap()/setImageResource() в качестве альтернативы для одного и того же изображения в зависимости от условий. Поэтому мне пришлось использовать setImageResource(0)/setImageBitmap(null) альтернативно, чтобы очистить изображение. Спасибо! - person Monica M; 20.03.2014

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

Это прекрасно работает для меня!

person kwasi    schedule 11.02.2011

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

person Arvis    schedule 18.01.2013

Как писали 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);
person KitKat    schedule 06.10.2013

Это работает для меня.

emoji.setBackground(null);

Это вылетает во время выполнения.

viewToUse.setImageResource(android.R.color.transparent);  
person sbchitra    schedule 18.02.2019

Чтобы удалить изображение в ImageView, используйте:

title_image.setImageResource(-1);

у меня работает

person Tobore Igbe    schedule 26.02.2016

Если вы используете библиотеку поддержки, вы получаете AppCompatImageView вместо ImageView , которая поддерживает setImageResource(0) на всех устройствах, поэтому вы можете использовать ее так же, как setImageDrawable(null) и setImageBitmap(null).

В противном случае он должен работать нормально, начиная с какой-либо версии Android. Судя по коду Android и моим тестам, я думаю, безопасно использовать setImageResource(0) из Android API 22 (5.1). Вы можете увидеть код Android API 22 и API 21 здесь

person android developer    schedule 30.04.2018

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

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

// затем устанавливаем изображение

edit_countflag.setImageResource(R.drawable.flag_id);
person Syed Danish Haider    schedule 21.05.2018

Я также пытался удалить изображение 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);
person TornaxO7    schedule 20.12.2019

Могу ли я просто указать, что вы все пытаетесь установить, и указать, где он ожидает рисования.

Вы не должны делать следующее?

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

imageview.setImageDrawable(getApplicationContext().getResources().getDrawable(R.drawable.icon_profile_image));
person Aaron Newton    schedule 12.04.2012

редактироватьТекст.setText();

imageView.setImageResource (0);

person FelizGuru    schedule 04.04.2021