Alterar imagem de ImageView programaticamente no Android

114

Quando eu mudo a imagem programaticamente, ele mostra a nova imagem em cima da imagem antiga que está definida originalmente no arquivo de layout?

Aqui está um snippet do meu arquivo de 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 o código que define o 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);

                       }
                   });

o que estou perdendo?

user1529412
fonte

Respostas:

179

Isso acontece porque você está definindo o src de ao ImageViewinvés do background.

Em vez disso, use:

qImageView.setBackgroundResource(R.drawable.thumbs_down);

Aqui está um tópico que fala sobre as diferenças entre os dois métodos.

Voicu
fonte
34
Isso não funciona na API 14. Deve usar:image.setImageResource(R.drawable.icon_dot1);
Brave
2
A resposta de @ Brave está correta. Usando setBackgroundResource():( não removeu a imagem existente antes de usar a nova imagem .. então eu tenho duas imagens colidindo lá. setImageResource()Funcionou tho :). Mesmo assim ... a postagem me colocou no caminho certo - muito obrigado por ambas as respostas!
Gene Bo,
Como diz a resposta de @mricyicy, o problema é que o xml está definindo a imagem de fundo e o código está alterando a imagem do recurso. Esses não são os mesmos. Definir a imagem do recurso é o que realmente se deseja aqui, portanto, o xml deve ser corrigido.
Martin Epsz de
3
Porque não setImageResource?
Violet Giraffe
4
@VioletGiraffe ImageView.setImageResource(R.drawable.image);funcionou para mim
jonasxd360
80

Use em XML:

android:src="@drawable/image"

Uso da fonte:

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

Resposta curta

Basta copiar uma imagem em sua res/drawablepasta e usar

imageView.setImageResource(R.drawable.my_image);

Detalhes

A variedade de respostas pode causar alguma confusão. Nós temos

Todos os métodos com Backgroundem seus nomes pertencem à Viewclasse, não ImageViewespecificamente. Mas, como ImageViewherda de Viewvocê, também pode usá-los. Os métodos com Imageem seu nome pertencem especificamente a ImageView.

Todos os Viewmétodos fazem a mesma coisa que os outros (embora setBackgroundDrawable()seja obsoleto), então vamos nos concentrar apenas em setBackgroundResource(). Da mesma forma, ImageViewtodos os métodos fazem a mesma coisa, então vamos nos concentrar apenas em setImageResource(). A única diferença entre os métodos é o tipo de parâmetro que você passa.

Configuração

Aqui está um FrameLayoutque contém um ImageView. O ImageViewinicialmente não contém nenhuma imagem. (Eu só adicionei o FrameLayoutpara poder colocar uma borda em torno dele. Dessa forma, você pode ver a borda do ImageView.)

insira a descrição da imagem aqui

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

Abaixo iremos comparar os diferentes métodos.

setImageResource ()

Se você usar ImageView's setImageResource(), a imagem manterá sua proporção e será redimensionada para caber. Aqui estão dois exemplos de imagens diferentes.

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

insira a descrição da imagem aqui

setBackgroundResource ()

Usar View's setBackgroundResource(), por outro lado, faz com que o recurso de imagem seja esticado para preencher a view.

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

insira a descrição da imagem aqui

Ambos

A imagem de fundo da View e a imagem da ImageView são desenhadas separadamente, então você pode definir ambas.

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

insira a descrição da imagem aqui

Suragch
fonte
1
observe o seguinte 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);

Eu acho que isso vai te ajudar

suraj
fonte
13

Em seu XML para a visualização da imagem, onde você android:background="@drawable/thumbs_down alterou paraandroid:src="@drawable/thumbs_down"

Atualmente, ele está colocando essa imagem como plano de fundo para a visualização e não a imagem real nela.

mricyicy
fonte
10

Em XML Design

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

Imagem Drawable via código

imageview.setImageResource(R.drawable.imagename);

Imagem do 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
fonte
0

Você pode usar

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

ou em java java

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