Cambia l'immagine di ImageView a livello di codice in Android


114

Quando cambio l'immagine a livello di codice, mostra la nuova immagine sopra la vecchia immagine che è impostata originariamente nel file di layout?

Ecco uno snippet del mio file di layout:

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

E il codice che imposta 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);

                       }
                   });

Cosa mi sto perdendo?

Risposte:


179

Ciò accade perché stai impostando lo src di ImageViewinvece dello sfondo.

Usa questo invece:

qImageView.setBackgroundResource(R.drawable.thumbs_down);

Ecco un thread che parla delle differenze tra i due metodi.


34
Questo non funziona nell'API 14. Dovrebbe usare:image.setImageResource(R.drawable.icon_dot1);
Brave

2
La risposta di @ Brave è corretta. L'uso di setBackgroundResource():( non ha rimosso l'immagine esistente prima di utilizzare la nuova immagine .. quindi ho ottenuto due immagini in collisione lì. Ha setImageResource()funzionato :). Comunque .. il post mi ha portato sulla strada giusta - i miei ringraziamenti per entrambe le risposte!
Gene Bo

Come dice la risposta di @mricyicy, il problema è che xml sta definendo l'immagine di sfondo e il codice sta cambiando l'immagine della risorsa. Quelle non sono la stessa cosa. L'impostazione dell'immagine della risorsa è ciò che è effettivamente desiderato qui, quindi l'xml dovrebbe essere corretto.
Martin Epsz

3
Perché no setImageResource?
Giraffa viola

4
@VioletGiraffe ha ImageView.setImageResource(R.drawable.image);lavorato per me
jonasxd360,

80

Usa in XML:

android:src="@drawable/image"

Uso della fonte:

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

47

Risposta breve

Basta copiare un'immagine nella res/drawablecartella e utilizzare

imageView.setImageResource(R.drawable.my_image);

Dettagli

La varietà di risposte può causare un po 'di confusione. abbiamo

I metodi con Backgroundnel nome appartengono tutti alla Viewclasse, non ImageViewspecificamente. Ma poiché ImageVieweredita da Viewte puoi usarli anche tu. I metodi con Imagenel nome appartengono specificamente a ImageView.

I Viewmetodi fanno tutti la stessa cosa l'uno dell'altro (sebbene setBackgroundDrawable()sia deprecato), quindi ci concentreremo solo su setBackgroundResource(). Allo stesso modo, i ImageViewmetodi fanno tutti la stessa cosa, quindi ci concentreremo solo su setImageResource(). L'unica differenza tra i metodi è il tipo di parametro che passi.

Impostare

Ecco un file FrameLayoutche contiene un file ImageView. Il ImageViewinizialmente non ha alcuna immagine in esso. (Ho aggiunto solo in FrameLayoutmodo da poter inserire un bordo attorno ad esso. In questo modo puoi vedere il bordo del ImageView.)

inserisci qui la descrizione dell'immagine

<?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 seguito confronteremo i diversi metodi.

setImageResource ()

Se usi ImageView setImageResource(), l'immagine mantiene le sue proporzioni e viene ridimensionata per adattarsi. Ecco due diversi esempi di immagini.

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

inserisci qui la descrizione dell'immagine

setBackgroundResource ()

L'utilizzo di View setBackgroundResource(), d'altra parte, fa sì che la risorsa immagine venga allungata per riempire la vista.

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

inserisci qui la descrizione dell'immagine

Tutti e due

L'immagine di sfondo della vista e l'immagine di ImageView vengono disegnate separatamente, quindi puoi impostarle entrambe.

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

inserisci qui la descrizione dell'immagine


1
nota quanto segue su 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);

Penso che questo ti aiuterà


13

Nel tuo XML per la visualizzazione dell'immagine, dove devi android:background="@drawable/thumbs_down cambiarloandroid:src="@drawable/thumbs_down"

Attualmente sta posizionando quell'immagine come sfondo della vista e non l'immagine effettiva al suo interno.


10

In XML Design

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

Immagine disegnabile tramite codice

imageview.setImageResource(R.drawable.imagename);

Immagine del 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);

0

Puoi usare

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

o in java java

Drawable drawableCompat = ContextCompat.getDrawable(getContext(), R.drawable.ic_emoticon_happy)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.