Cambiar la imagen de ImageView mediante programación en Android

114

Cuando cambio la imagen mediante programación, ¿muestra una nueva imagen encima de la imagen anterior que se estableció originalmente en el archivo de diseño?

Aquí hay un fragmento de mi archivo de diseño:

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

Y el código que establece 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é me estoy perdiendo?

usuario1529412
fuente

Respuestas:

179

Eso sucede porque está configurando el src del en ImageViewlugar del background.

Use esto en su lugar:

qImageView.setBackgroundResource(R.drawable.thumbs_down);

Aquí hay un hilo que habla sobre las diferencias entre los dos métodos.

Voicu
fuente
34
Esto no funciona en API 14. Debería usar:image.setImageResource(R.drawable.icon_dot1);
Brave
2
La respuesta de @ Brave es correcta. El uso de setBackgroundResource():( no eliminó la imagen existente antes de usar la nueva imagen ... así que obtuve dos imágenes colisionando allí. Aunque setImageResource()funcionó :). Aún así ... la publicación me puso en el camino correcto. ¡Gracias por ambas respuestas!
Gene Bo
Como dice la respuesta de @mricyicy, el problema es que el xml está definiendo la imagen de fondo y el código está cambiando la imagen del recurso. Esos no son los mismos. Configurar la imagen del recurso es lo que realmente se desea aquí, por lo que el xml debe arreglarse.
Martin Epsz
3
¿Por qué no setImageResource?
Jirafa violeta
4
@VioletGiraffe ImageView.setImageResource(R.drawable.image);trabajó para mí
jonasxd360
80

Usar en XML:

android:src="@drawable/image"

Uso de la fuente:

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

Respuesta corta

Simplemente copie una imagen en su res/drawablecarpeta y use

imageView.setImageResource(R.drawable.my_image);

Detalles

La variedad de respuestas puede causar cierta confusión. Tenemos

BackgroundTodos los métodos con su nombre pertenecen a la Viewclase, no ImageViewespecíficamente. Pero dado que ImageViewhereda de Viewusted también puede usarlos. Los métodos con Imagesu nombre pertenecen específicamente a ImageView.

Los Viewmétodos, todos ellos hacen lo mismo que la otra (aunque setBackgroundDrawable()está en desuso), así que sólo se centran en setBackgroundResource(). De manera similar, ImageViewtodos los métodos hacen lo mismo, por lo que solo nos centraremos en setImageResource(). La única diferencia entre los métodos es el tipo de parámetro que ingresa.

Preparar

Aquí hay un FrameLayoutque contiene un ImageView. El ImageViewinicialmente no tiene ninguna imagen. (Solo agregué el FrameLayoutpara poder poner un borde alrededor. De esa manera, puede ver el borde ImageView).

ingrese la descripción de la imagen aquí

<?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 continuación compararemos los diferentes métodos.

setImageResource ()

Si usa ImageView setImageResource(), la imagen mantiene su relación de aspecto y cambia de tamaño para adaptarse. Aquí hay dos ejemplos de imágenes diferentes.

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

ingrese la descripción de la imagen aquí

setBackgroundResource ()

Usando View's setBackgroundResource() , por otro lado, hace que el recurso de imagen se estire para llenar la vista.

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

ingrese la descripción de la imagen aquí

Ambos

La imagen de fondo de la vista y la imagen de ImageView se dibujan por separado, por lo que puede configurar ambas.

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

ingrese la descripción de la imagen aquí

Suragch
fuente
1
tenga en cuenta lo siguiente sobre 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);

Creo que esto te ayudará

suraj
fuente
13

En su XML para la vista de imagen, donde tiene android:background="@drawable/thumbs_down cambiado esto aandroid:src="@drawable/thumbs_down"

Actualmente está colocando esa imagen como fondo de la vista y no como la imagen real en ella.

mricyicy
fuente
10

En Diseño XML

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

Imagen dibujable mediante código

imageview.setImageResource(R.drawable.imagename);

Imagen del servidor

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

Puedes usar

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

o en java java

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