Zmień obraz ImageView programowo w systemie Android


114

Kiedy zmieniam obraz programowo, pokazuje on nowy obraz na górze starego obrazu, który jest pierwotnie ustawiony w pliku układu?

Oto fragment mojego pliku układu:

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

Oraz kod, który ustawia 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);

                       }
                   });

czego mi brakuje?

Odpowiedzi:


179

Dzieje się tak, ponieważ ustawiasz src ImageViewzamiast tła.

Użyj tego zamiast tego:

qImageView.setBackgroundResource(R.drawable.thumbs_down);

Oto wątek, który mówi o różnicach między tymi dwiema metodami.


34
To nie działa w API 14. Należy użyć:image.setImageResource(R.drawable.icon_dot1);
Brave

2
Odpowiedź @ Brave jest prawidłowa. Użycie setBackgroundResource():( nie usunęło istniejącego obrazu przed użyciem nowego obrazu .. więc otrzymałem dwa zderzające się tam obrazy. setImageResource()Działało :) Mimo to… post zaprowadził mnie na właściwą ścieżkę - dziękuję za obie odpowiedzi!
Gene Bo,

Jak mówi @mricyicy, problem polega na tym, że xml definiuje obraz tła, a kod zmienia obraz zasobu. To nie to samo. W rzeczywistości pożądane jest ustawienie obrazu zasobu, więc plik XML powinien zostać naprawiony.
Martin Epsz

3
Dlaczego nie setImageResource?
Violet Giraffe

4
@VioletGiraffe ImageView.setImageResource(R.drawable.image);pracowała dla mnie
jonasxd360

80

Użyj w XML:

android:src="@drawable/image"

Wykorzystanie źródła:

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

47

Krótka odpowiedź

Po prostu skopiuj obraz do swojego res/drawablefolderu i użyj

imageView.setImageResource(R.drawable.my_image);

Detale

Różnorodność odpowiedzi może spowodować trochę zamieszania. Mamy

Wszystkie metody mające Backgroundw nazwie należą do Viewklasy, a nie ImageViewkonkretnie. Ale ponieważ ImageViewdziedziczy po Viewtobie, też możesz z nich korzystać. Metody mające Imagew nazwie należą konkretnie do ImageView.

Wszystkie Viewmetody robią to samo co inne (chociaż setBackgroundDrawable()są przestarzałe), więc skupimy się tylko na setBackgroundResource(). Podobnie, ImageViewwszystkie metody robią to samo, więc po prostu się na nich skupimy setImageResource(). Jedyną różnicą między tymi metodami jest typ przekazywanego parametru.

Ustawiać

Oto plik FrameLayoutzawierający plik ImageView. ImageViewPoczątkowo nie ma żadnego obrazu w nim. (Dodałem tylko po FrameLayoutto, aby móc umieścić wokół niego obramowanie. W ten sposób możesz zobaczyć krawędź ImageView.)

wprowadź opis obrazu tutaj

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

Poniżej porównamy różne metody.

setImageResource ()

Jeśli używasz ImageView setImageResource(), obraz zachowuje proporcje i jest dopasowywany do rozmiaru. Oto dwa różne przykłady obrazów.

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

wprowadź opis obrazu tutaj

setBackgroundResource ()

setBackgroundResource()Z drugiej strony korzystanie z widoku powoduje rozciągnięcie zasobu obrazu w celu wypełnienia widoku.

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

wprowadź opis obrazu tutaj

Obie

Obraz tła widoku i obraz ImageView są rysowane oddzielnie, więc możesz ustawić je oba.

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

wprowadź opis obrazu tutaj


1
zwróć uwagę na następujące informacje 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);

Myślę, że to ci pomoże


13

W twoim XML dla widoku obrazu, gdzie android:background="@drawable/thumbs_down zmieniłeś to naandroid:src="@drawable/thumbs_down"

Obecnie umieszcza ten obraz jako tło widoku, a nie rzeczywisty obraz w nim.


10

W projektowaniu XML

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

Obraz do rysowania za pomocą kodu

imageview.setImageResource(R.drawable.imagename);

Obraz serwera

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

Możesz użyć

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

lub w java java

Drawable drawableCompat = ContextCompat.getDrawable(getContext(), R.drawable.ic_emoticon_happy)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.