Змініть зображення 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замість фону.

Використовуйте це замість:

qImageView.setBackgroundResource(R.drawable.thumbs_down);

Ось нитка, яка розповідає про відмінності двох методів.


34
Це не працює в API 14. Слід використовувати:image.setImageResource(R.drawable.icon_dot1);
Brave

2
@ Відповідь Хороброго правильна. Використання setBackgroundResource():( не видаляв існуюче зображення перед тим, як використовувати нове зображення .. тож у мене зіткнулися два зображення. setImageResource()Працювало Тхо :). І все-таки .. публікація поставила мене на правильний шлях - дякую за обидві відповіді!
Джин Бо

Як йдеться у відповіді @mricyicy, проблема полягає в тому, що xml визначає фонове зображення, а код змінює зображення ресурсу. Це не те саме. Налаштування образу ресурсу - це те, що насправді бажано, тому xml має бути виправлено.
Мартін Епш

3
Чому ні setImageResource?
Фіолетова жирафа

4
@VioletGiraffe ImageView.setImageResource(R.drawable.image);працював на мене
jonasxd360

80

Використання в XML:

android:src="@drawable/image"

Використання джерела:

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

47

Коротка відповідь

Просто скопіюйте зображення у свою 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 ()

Використання View setBackgroundResource(), з іншого боку, призводить до розтягування ресурсу зображення, щоб заповнити подання.

  • 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"

Наразі це зображення розміщує це зображення як фон для подання, а не фактичне зображення в ньому.


10

У 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.