Программное изменение изображения ImageView в Android


114

Когда я изменяю изображение программно, оно показывает новое изображение поверх старого изображения, которое изначально задано в файле макета?

Вот фрагмент моего файла макета:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="39dp"
    android:gravity="center_vertical" >
    <ImageView
        android:id="@+id/qStatusImage"
        android:layout_width="16dp"
        android:layout_height="16dp"
        android:layout_margin="5dp"
        android:background="@drawable/thumbs_down"
         />

    <TextView
        android:id="@+id/grp_child"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:textColor="@color/radio_colors"
        android:textStyle="normal"
        android:background="@color/grey"
    />

 </LinearLayout>

И код, который устанавливает imageView:

     @Override
public View getChildView(final int groupPosition, final int childPosition,
        boolean isLastChild, View convertView, ViewGroup parent) {
//Answers
            if(answersGroup != null)
                   answersGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {
                       @Override
                    public void onCheckedChanged(RadioGroup group, int checkedId) {

                         //  int index = answersGroup.indexOfChild(findViewById(answersGroup.getCheckedRadioButtonId()));

                           qImageView = (ImageView) V.findViewById(R.id.qStatusImage);
                           if(ans ==0 || ans == 5){
                            //   qSV.setImageResource(0);
                               qImageView.setImageResource(R.drawable.thumbs_up);
                           }
                           else
                               qImageView.setImageResource(R.drawable.thumbs_down);

                       }
                   });

Что мне не хватает?

Ответы:


179

Это происходит потому, что вы устанавливаете src ImageViewвместо background.

Используйте вместо этого:

qImageView.setBackgroundResource(R.drawable.thumbs_down);

Вот ветка, в которой рассказывается о различиях между двумя методами.


34
Это не работает в API 14. Следует использовать:image.setImageResource(R.drawable.icon_dot1);
Brave

2
@ Храбрый ответ правильный. Использование setBackgroundResource():( не удаляло существующее изображение перед использованием нового изображения .. так что у меня два изображения сталкиваются там. setImageResource()Сработало tho :). Тем не менее, этот пост направил меня на верный путь - спасибо за оба ответа!
Джин Бо,

Как говорится в ответе @mricyicy, проблема в том, что xml определяет фоновое изображение, а код меняет изображение ресурса. Это не то же самое. На самом деле здесь требуется установка изображения ресурса, поэтому xml следует исправить.
Мартин Эпс,

3
А почему бы и нет setImageResource?
Violet Giraffe

4
@VioletGiraffe ImageView.setImageResource(R.drawable.image);работал у меня
jonasxd360

80

Использование в XML:

android:src="@drawable/image"

Использование источника:

imageView.setImageDrawable(ContextCompat.getDrawable(activity, R.drawable.your_image));

48

Короткий ответ

Просто скопируйте изображение в свою res/drawableпапку и используйте

imageView.setImageResource(R.drawable.my_image);

подробности

Разнообразие ответов может вызвать небольшую путаницу. У нас есть

Все методы , указанные Backgroundв имени, относятся к Viewклассу, а не к ImageViewконкретному. Но поскольку ImageViewнаследуется от Viewвас, вы тоже можете их использовать. Методы, имеющие Imageв своем названии, относятся конкретно к ImageView.

Все Viewметоды делают одно и то же (хотя setBackgroundDrawable()и устарели), поэтому мы просто сосредоточимся на них setBackgroundResource(). Точно так же ImageViewвсе методы делают одно и то же, поэтому мы просто сосредоточимся на них setImageResource(). Единственная разница между методами - это тип передаваемого вами параметра.

Настроить

Вот файл FrameLayout, содержащий файл ImageView. ImageViewИзначально не имеет никакого образа в нем. (Я добавил только для того, FrameLayoutчтобы обвести его рамкой. Таким образом, вы можете видеть край ImageView.)

введите описание изображения здесь

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/frameLayout"
        android:layout_width="250dp"
        android:layout_height="250dp"
        android:background="@drawable/border"
        android:layout_centerInParent="true">

        <ImageView
            android:id="@+id/imageView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

    </FrameLayout>
</RelativeLayout>

Ниже мы сравним разные методы.

setImageResource ()

Если вы используете ImageView setImageResource(), то изображение сохраняет свое соотношение сторон и изменяется в соответствии с размером. Вот два разных примера изображений.

  • imageView.setImageResource(R.drawable.sky);
  • imageView.setImageResource(R.drawable.balloons);

введите описание изображения здесь

setBackgroundResource ()

С setBackgroundResource()другой стороны, использование View заставляет ресурс изображения растягиваться, чтобы заполнить вид.

  • imageView.setBackgroundResource(R.drawable.sky);
  • imageView.setBackgroundResource(R.drawable.balloons);

введите описание изображения здесь

Обе

Фоновое изображение View и изображение ImageView рисуются отдельно, поэтому вы можете установить их оба.

imageView.setBackgroundResource(R.drawable.sky);
imageView.setImageResource(R.drawable.balloons);

введите описание изображения здесь


1
обратите внимание на следующее setImageResource:Sets a drawable as the content of this ImageView. This does Bitmap reading and decoding on the UI thread, which can cause a latency hiccup. If that's a concern, consider using setImageDrawable(Drawable) or setImageBitmap(Bitmap) and android.graphics.BitmapFactory instead.
Уильям Рид


13

В вашем XML для представления изображения, где вы android:background="@drawable/thumbs_down изменили это наandroid:src="@drawable/thumbs_down"

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


11

В XML-дизайне

android:background="@drawable/imagename 
android:src="@drawable/imagename"

Рисуемое изображение через код

imageview.setImageResource(R.drawable.imagename);

Образ сервера

  ## Dependency ##

  implementation 'com.github.bumptech.glide:glide:4.7.1'
  annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'

  Glide.with(context).load(url) .placeholder(R.drawable.image)
   .into(imageView);

 ## dependency  ##
 implementation 'com.squareup.picasso:picasso:2.71828'

 Picasso.with(context).load(url) .placeholder(R.drawable.image)
 .into(imageView);

0

Ты можешь использовать

val drawableCompat = ContextCompat.getDrawable(context, R.drawable.ic_emoticon_happy)

или в java java

Drawable drawableCompat = ContextCompat.getDrawable(getContext(), R.drawable.ic_emoticon_happy)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.