ImageView Görüntüsünü Android'de programlı olarak değiştirin


114

Görüntüyü programla değiştirdiğimde, orijinal olarak yerleşim dosyasında ayarlanan eski görüntünün üstünde yeni görüntü gösteriyor?

İşte düzen dosyamın bir parçası:

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

Ve imageView'i ayarlayan kod:

     @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);

                       }
                   });

Neyi kaçırıyorum?

Yanıtlar:


179

Bunun nedeni ImageViewarka plan yerine src'yi ayarlamanızdır .

Bunun yerine şunu kullanın:

qImageView.setBackgroundResource(R.drawable.thumbs_down);

İşte iki yöntem arasındaki farklardan bahseden bir konu.


34
Bu, API 14'te çalışmaz. image.setImageResource(R.drawable.icon_dot1);
Brave

2
@ Brave'in cevabı doğru. Kullanımı setBackgroundResource():( yeni resmi kullanmadan önce mevcut resmi kaldırmadı .. bu yüzden orada çarpışan iki resim var. setImageResource()Çalıştım :). Yine de .. gönderi beni doğru yola soktu - her iki yanıt için de teşekkürler!
Gene Bo

@Mricyicy'nin cevabının dediği gibi, sorun xml'nin arka plan görüntüsünü tanımlaması ve kodun kaynak görüntüsünü değiştirmesidir. Bunlar aynı değil. Kaynak görüntüsünü ayarlamak aslında burada istenen şeydir, bu nedenle xml düzeltilmelidir.
Martin Epsz

3
Neden olmasın setImageResource?
Violet Zürafa

4
@VioletGiraffe ImageView.setImageResource(R.drawable.image);benim için çalıştı
jonasxd360

80

XML'de kullanın:

android:src="@drawable/image"

Kaynak kullanımı:

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

47

Kısa cevap

res/drawableKlasörünüze bir resim kopyalayın ve

imageView.setImageResource(R.drawable.my_image);

Detaylar

Cevapların çeşitliliği biraz kafa karışıklığına neden olabilir. Sahibiz

Adlarında bulunan yöntemlerin Backgroundtümü Viewsınıfa aittir , ImageViewözel olarak değil . Ama sizden ImageViewmiras aldığı Viewiçin onları da kullanabilirsiniz. Adında bulunan yöntemler Imageözellikle aittir ImageView.

View(Gerçi yöntemler hepsi birbirine aynı şeyi yapmak setBackgroundDrawable()artık kullanılmamaktadır) biz sadece üzerinde durulacak böylece setBackgroundResource(). Benzer şekilde, ImageViewyöntemlerin hepsi aynı şeyi yapar, bu yüzden sadece odaklanacağız setImageResource(). Yöntemler arasındaki tek fark, ilettiğiniz parametre türleridir.

Kurmak

İşte bir FrameLayoutiçeren bir ImageView. ImageViewBaşlangıçta bunun herhangi bir görüntü yok. (Sadece FrameLayoutetrafına bir sınır koyabilmek için ekledim . Bu şekilde kenarını görebilirsiniz ImageView.)

görüntü açıklamasını buraya girin

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

Aşağıda farklı yöntemleri karşılaştıracağız.

setImageResource ()

ImageView kullanırsanız setImageResource(), görüntü en boy oranını korur ve sığması için yeniden boyutlandırılır. İşte iki farklı resim örneği.

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

görüntü açıklamasını buraya girin

setBackgroundResource ()

Görünüm adlı kullanarak setBackgroundResource()diğer taraftan, görüntü kaynak görünümü doldurmak için gergin neden olur.

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

görüntü açıklamasını buraya girin

Her ikisi de

Görünümün arka plan görüntüsü ve ImageView görüntüsü ayrı ayrı çizilir, böylece her ikisini de ayarlayabilirsiniz.

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

görüntü açıklamasını buraya girin


1
aşağıdakilere dikkat edin 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);

Bunun sana yardımcı olacağını düşünüyorum


13

Bunu şu şekilde android:background="@drawable/thumbs_down değiştirdiğiniz resim görünümü için XML'nizdeandroid:src="@drawable/thumbs_down"

Şu anda, bu görüntüyü, görüntünün gerçek görüntüsü değil, görüntünün arka planı olarak yerleştiriyor.


11

XML Tasarımında

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

Kod ile Çekilebilir Görüntü

imageview.setImageResource(R.drawable.imagename);

Sunucu görüntüsü

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

Kullanabilirsiniz

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

veya java java'da

Drawable drawableCompat = ContextCompat.getDrawable(getContext(), R.drawable.ic_emoticon_happy)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.