Ändern Sie das Image von ImageView programmgesteuert in Android

114

Wenn ich das Bild programmgesteuert ändere, wird ein neues Bild über dem alten Bild angezeigt, das ursprünglich in der Layoutdatei festgelegt wurde.

Hier ist ein Ausschnitt aus meiner Layoutdatei:

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

Und der Code, der die imageView festlegt:

     @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);

                       }
                   });

Was vermisse ich?

user1529412
quelle

Antworten:

179

Dies geschieht, weil Sie den Quellcode ImageViewanstelle des Hintergrunds festlegen .

Verwenden Sie stattdessen Folgendes:

qImageView.setBackgroundResource(R.drawable.thumbs_down);

Hier ist ein Thread, der über die Unterschiede zwischen den beiden Methoden spricht.

Voicu
quelle
34
Dies funktioniert nicht in API 14. Sollte verwenden:image.setImageResource(R.drawable.icon_dot1);
Brave
2
@ Braves Antwort ist richtig. Mit setBackgroundResource():( wurde das vorhandene Bild nicht entfernt, bevor das neue Bild verwendet wurde. Daher sind dort zwei Bilder kollidiert setImageResource(). Trotzdem ... der Beitrag hat mich auf den richtigen Weg gebracht - mein Dank für beide Antworten!
Gene Bo
Wie die Antwort von @mricyicy sagt, besteht das Problem darin, dass die XML das Hintergrundbild definiert und der Code das Ressourcenbild ändert. Das sind nicht die gleichen. Das Festlegen des Ressourcenabbilds ist hier eigentlich erwünscht, daher sollte die XML-Datei korrigiert werden.
Martin Epsz
3
Warum nicht setImageResource?
Violette Giraffe
4
@ VioletGiraffe ImageView.setImageResource(R.drawable.image);arbeitete für mich
jonasxd360
80

Verwendung in XML:

android:src="@drawable/image"

Quellenverwendung:

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

Kurze Antwort

Kopieren Sie einfach ein Bild in Ihren res/drawableOrdner und verwenden Sie

imageView.setImageResource(R.drawable.my_image);

Einzelheiten

Die Vielzahl der Antworten kann zu Verwirrung führen. Wir haben

Die Methoden mit Backgroundihrem Namen gehören alle zur ViewKlasse, nicht ImageViewspeziell. Aber da ImageViewerbt von ViewIhnen können Sie sie auch verwenden. Die Methoden mit Imagein ihrem Namen gehören speziell dazu ImageView.

Die ViewMethoden machen alle dasselbe (obwohl sie setBackgroundDrawable()veraltet sind), also konzentrieren wir uns nur darauf setBackgroundResource(). In ähnlicher Weise machen ImageViewalle Methoden dasselbe, also konzentrieren wir uns nur darauf setImageResource(). Der einzige Unterschied zwischen den Methoden besteht darin, welche Art von Parameter Sie übergeben.

Konfiguration

Hier ist eine FrameLayout, die eine enthält ImageView. Der hat ImageViewanfangs kein Bild drin. (Ich habe nur das hinzugefügt, FrameLayoutdamit ich einen Rand darum legen kann. Auf diese Weise können Sie den Rand des sehen ImageView.)

Geben Sie hier die Bildbeschreibung ein

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

Nachfolgend werden wir die verschiedenen Methoden vergleichen.

setImageResource ()

Wenn Sie ImageViews verwenden setImageResource(), behält das Bild sein Seitenverhältnis bei und wird an die Größe angepasst . Hier sind zwei verschiedene Bildbeispiele.

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

Geben Sie hier die Bildbeschreibung ein

setBackgroundResource ()

Wenn Sie setBackgroundResource()dagegen Ansichten verwenden, wird die Bildressource gedehnt, um die Ansicht zu füllen.

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

Geben Sie hier die Bildbeschreibung ein

Beide

Das Hintergrundbild der Ansicht und das Bild der ImageView werden separat gezeichnet, sodass Sie beide festlegen können.

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

Geben Sie hier die Bildbeschreibung ein

Suragch
quelle
1
Beachten Sie Folgendes über 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);

Ich denke, das wird dir helfen

suraj
quelle
13

In Ihrem XML für die Bildansicht, wo Sie dies android:background="@drawable/thumbs_down geändert habenandroid:src="@drawable/thumbs_down"

Derzeit wird dieses Bild als Hintergrund für die Ansicht und nicht als tatsächliches Bild darin platziert.

mricyicy
quelle
10

Im XML-Design

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

Zeichenbares Bild per Code

imageview.setImageResource(R.drawable.imagename);

Server-Image

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

Sie können verwenden

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

oder in Java Java

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