Modifier l'image d'ImageView par programmation dans Android


114

Lorsque je change l'image par programme, il affiche une nouvelle image au-dessus de l'ancienne image qui est définie à l'origine dans le fichier de mise en page?

Voici un extrait de mon fichier de mise en page:

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

Et le code qui définit l'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);

                       }
                   });

Qu'est-ce que je rate?

Réponses:


179

Cela se produit parce que vous définissez le src de la ImageViewplace de l'arrière-plan.

Utilisez plutôt ceci:

qImageView.setBackgroundResource(R.drawable.thumbs_down);

Voici un fil qui parle des différences entre les deux méthodes.


34
Cela ne fonctionne pas dans l'API 14. Devrait utiliser:image.setImageResource(R.drawable.icon_dot1);
Brave

2
La réponse de @ Brave est correcte. L'utilisation de setBackgroundResource():( n'a pas supprimé l'image existante avant d'utiliser la nouvelle image .. donc j'ai eu deux images en collision là-bas. Cela a setImageResource()fonctionné :). Pourtant ... le message m'a mis sur la bonne voie - merci pour les deux réponses!
Gene Bo

Comme le dit la réponse de @mricyicy, le problème est que le xml définit l'image d'arrière-plan et que le code change l'image de la ressource. Ce ne sont pas les mêmes. La définition de l'image de la ressource est ce qui est réellement souhaité ici, le xml doit donc être corrigé.
Martin Epsz

3
Pourquoi pas setImageResource?
Violet Giraffe

4
@VioletGiraffe a ImageView.setImageResource(R.drawable.image);travaillé pour moi
jonasxd360

80

Utilisation en XML:

android:src="@drawable/image"

Utilisation de la source:

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

47

Réponse courte

Copiez simplement une image dans votre res/drawabledossier et utilisez

imageView.setImageResource(R.drawable.my_image);

Détails

La variété des réponses peut semer la confusion. Nous avons

Les méthodes avec Backgrounddans leur nom appartiennent toutes à la Viewclasse, pas ImageViewspécifiquement. Mais depuis ImageViewhérite de Viewvous pouvez aussi les utiliser. Les méthodes avec Imagedans leur nom appartiennent spécifiquement à ImageView.

Les Viewméthodes font toutes la même chose les unes que les autres (bien qu'elles setBackgroundDrawable()soient obsolètes), nous allons donc nous concentrer uniquement sur setBackgroundResource(). De même, les ImageViewméthodes font toutes la même chose, nous allons donc nous concentrer sur setImageResource(). La seule différence entre les méthodes est le type de paramètre que vous transmettez.

Installer

Voici un FrameLayoutqui contient un fichier ImageView. Le ImageViewpremier ne contient aucune image. (J'ai seulement ajouté le FrameLayoutpour pouvoir mettre une bordure autour. De cette façon, vous pouvez voir le bord du ImageView.)

entrez la description de l'image ici

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

Ci-dessous, nous comparerons les différentes méthodes.

setImageResource ()

Si vous utilisez ImageView setImageResource(), l'image conserve son rapport hauteur / largeur et est redimensionnée pour s'adapter. Voici deux exemples d'images différents.

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

entrez la description de l'image ici

setBackgroundResource ()

L'utilisation de View setBackgroundResource(), en revanche, entraîne l'étirement de la ressource image pour remplir la vue.

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

entrez la description de l'image ici

Tous les deux

L'image d'arrière-plan de la vue et l'image de l'ImageView sont dessinées séparément, vous pouvez donc les définir toutes les deux.

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

entrez la description de l'image ici


1
notez ce qui suit à propos de 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);

Je crois que ceci vous aidera


13

Dans votre XML pour la vue d'image, où vous avez android:background="@drawable/thumbs_down changé cela enandroid:src="@drawable/thumbs_down"

Actuellement, il place cette image comme arrière-plan de la vue et non l'image réelle qu'elle contient.


10

Dans la conception XML

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

Image dessinable via code

imageview.setImageResource(R.drawable.imagename);

Image du serveur

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

Vous pouvez utiliser

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

ou en java java

Drawable drawableCompat = ContextCompat.getDrawable(getContext(), R.drawable.ic_emoticon_happy)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.