Ubah Gambar ImageView secara terprogram di Android

114

Ketika saya mengubah gambar secara terprogram, itu menunjukkan gambar baru di atas gambar lama yang awalnya disetel dalam file layout?

Berikut ini cuplikan file tata letak saya:

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

Dan kode yang menyetel 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);

                       }
                   });

Apa yang saya lewatkan?

pengguna1529412
sumber

Jawaban:

179

Itu terjadi karena Anda menyetel src dari ImageViewalih - alih latar belakang.

Gunakan ini sebagai gantinya:

qImageView.setBackgroundResource(R.drawable.thumbs_down);

Berikut adalah utas yang membahas tentang perbedaan antara kedua metode tersebut.

Voicu
sumber
34
Ini tidak bekerja di API 14. Harus menggunakan:image.setImageResource(R.drawable.icon_dot1);
Brave
2
@ Jawaban Brave benar. Menggunakan setBackgroundResource():( tidak menghapus gambar yang ada sebelum menggunakan gambar baru .. jadi saya mendapat dua gambar bertabrakan di sana. setImageResource()Berhasil :). Tetap saja .. pos tersebut membuat saya berada di jalur yang benar - terima kasih atas kedua jawaban tersebut!
Gene Bo
Seperti yang dikatakan oleh jawaban oleh @mricyicy, masalahnya adalah xml menentukan gambar latar belakang dan kode sedang mengubah gambar sumber daya. Itu tidak sama. Menyetel gambar sumber daya adalah yang sebenarnya diinginkan di sini, jadi xml harus diperbaiki.
Martin Epsz
3
Mengapa tidak setImageResource?
Violet Giraffe
4
@VioletGiraffe ImageView.setImageResource(R.drawable.image);bekerja untuk saya
jonasxd360
80

Gunakan dalam XML:

android:src="@drawable/image"

Penggunaan sumber:

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

Jawaban singkat

Cukup salin gambar ke res/drawablefolder Anda dan gunakan

imageView.setImageResource(R.drawable.my_image);

Detail

Variasi jawaban dapat menyebabkan sedikit kebingungan. Kita punya

Semua metode dengan Backgroundnamanya semua milik Viewkelas, bukan ImageViewsecara khusus. Tapi karena ImageViewmewarisi dari ViewAnda bisa menggunakannya juga. Metode dengan Imagenama mereka adalah milik khusus ImageView.

Semua Viewmetode melakukan hal yang sama satu sama lain (meskipun setBackgroundDrawable()sudah usang), jadi kami hanya akan fokus setBackgroundResource(). Demikian pula, ImageViewsemua metode melakukan hal yang sama, jadi kami hanya akan fokus setImageResource(). Satu-satunya perbedaan antara metode ini adalah jenis parameter yang Anda berikan.

Mempersiapkan

Ini FrameLayoutyang berisi ImageView. The ImageViewawalnya tidak memiliki gambar apapun di dalamnya. (Saya hanya menambahkan FrameLayoutsehingga saya bisa memberi batas di sekelilingnya. Dengan begitu Anda bisa melihat tepi ImageView.)

masukkan deskripsi gambar di sini

<?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>

Di bawah ini kami akan membandingkan berbagai metode.

setImageResource ()

Jika Anda menggunakan ImageView setImageResource(), maka gambar akan mempertahankan rasio aspeknya dan diubah ukurannya agar pas. Berikut adalah dua contoh gambar yang berbeda.

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

masukkan deskripsi gambar di sini

setBackgroundResource ()

setBackgroundResource()Sebaliknya, menggunakan View menyebabkan sumber daya gambar direntangkan untuk mengisi tampilan.

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

masukkan deskripsi gambar di sini

Kedua

Gambar latar View dan gambar ImageView digambar secara terpisah, sehingga Anda dapat mengatur keduanya.

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

masukkan deskripsi gambar di sini

Suragch
sumber
1
perhatikan hal-hal berikut tentang 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.
William Reed
27
qImageView.setImageResource(R.drawable.img2);

Saya pikir ini akan membantu Anda

suraj
sumber
13

Dalam XML Anda untuk tampilan gambar, di mana Anda telah android:background="@drawable/thumbs_down mengubahnya menjadiandroid:src="@drawable/thumbs_down"

Saat ini menempatkan gambar itu sebagai latar belakang tampilan dan bukan gambar sebenarnya di dalamnya.

mricyicy
sumber
10

Dalam Desain XML

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

Gambar Dapat Digambar melalui kode

imageview.setImageResource(R.drawable.imagename);

Gambar server

  ## 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);
Ashutosh Srivastava
sumber
0

Kamu bisa memakai

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

atau di java java

Drawable drawableCompat = ContextCompat.getDrawable(getContext(), R.drawable.ic_emoticon_happy)
svkaka
sumber