เปลี่ยนรูปภาพของ ImageView โดยทางโปรแกรมใน Android


114

เมื่อฉันเปลี่ยนรูปภาพโดยทางโปรแกรมจะแสดงภาพใหม่ที่ด้านบนของภาพเก่าซึ่งตั้งค่าไว้ในไฟล์เลย์เอาต์?

นี่คือตัวอย่างไฟล์เลย์เอาต์ของฉัน:

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

และรหัสที่ตั้งค่า 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);

                       }
                   });

ฉันขาดอะไรไป?

คำตอบ:


179

เกิดขึ้นเนื่องจากคุณกำลังตั้งค่า src ของImageViewพื้นหลังแทน

ใช้สิ่งนี้แทน:

qImageView.setBackgroundResource(R.drawable.thumbs_down);

นี่คือหัวข้อที่พูดถึงความแตกต่างระหว่างสองวิธี


34
สิ่งนี้ใช้ไม่ได้ใน API 14 ควรใช้:image.setImageResource(R.drawable.icon_dot1);
Brave

2
@ คำตอบของผู้กล้าถูกต้อง การใช้setBackgroundResource():( ไม่ได้ลบภาพที่มีอยู่ก่อนที่จะใช้ภาพใหม่ .. ดังนั้นฉันจึงได้ภาพสองภาพมาชนกันที่นั่นได้ผล setImageResource():) ยัง .. โพสต์ทำให้ฉันมาถูกทาง - ขอบคุณสำหรับคำตอบทั้งสอง!
ยีนบ่อ

ดังที่คำตอบของ @mricyicy กล่าวว่าปัญหาคือ xml กำลังกำหนดภาพพื้นหลังและรหัสกำลังเปลี่ยนภาพทรัพยากร เหล่านั้นไม่เหมือนกัน การตั้งค่าอิมเมจทรัพยากรเป็นสิ่งที่ต้องการจริงๆที่นี่ดังนั้นควรแก้ไข xml
Martin Epsz

3
ทำไมไม่setImageResource?
ยีราฟสีม่วง

4
@VioletGiraffe ImageView.setImageResource(R.drawable.image);ทำงานให้ฉัน
jonasxd360

80

ใช้ใน XML:

android:src="@drawable/image"

การใช้แหล่งที่มา:

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

47

คำตอบสั้น ๆ

เพียงแค่คัดลอกรูปภาพลงในres/drawableโฟลเดอร์ของคุณและใช้

imageView.setImageResource(R.drawable.my_image);

รายละเอียด

คำตอบที่หลากหลายอาจทำให้เกิดความสับสนเล็กน้อย เรามี

เมธอดที่มีBackgroundชื่อของพวกเขาทั้งหมดเป็นของViewคลาสไม่ใช่ImageViewเฉพาะ แต่เนื่องจากImageViewมรดกจากViewคุณสามารถใช้ได้เช่นกัน วิธีการที่มีในชื่อของพวกเขาอยู่โดยเฉพาะเพื่อImageImageView

Viewวิธีการทั้งหมดทำในสิ่งเดียวกับแต่ละอื่น ๆ (แม้setBackgroundDrawable()จะเลิก) setBackgroundResource()ดังนั้นเราก็จะมุ่งเน้น ในทำนองเดียวกันทุกวิธีการทำสิ่งเดียวกันดังนั้นเราก็จะมุ่งเน้นไปที่ImageView setImageResource()ความแตกต่างเพียงอย่างเดียวระหว่างวิธีการคือประเภทของพารามิเตอร์ที่คุณส่งผ่าน

ติดตั้ง

นี่คือที่ประกอบด้วยFrameLayout แรกไม่มีภาพใด ๆ อยู่ในนั้น (ฉันเพิ่มเพียงเพื่อให้ฉันสามารถวางเส้นขอบรอบ ๆ ได้ด้วยวิธีนี้คุณจะเห็นขอบของ)ImageViewImageViewFrameLayoutImageView

ใส่คำอธิบายภาพที่นี่

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

ด้านล่างเราจะเปรียบเทียบวิธีการต่างๆ

setImageResource ()

หากคุณใช้ ImageView setImageResource()รูปภาพจะคงอัตราส่วนและปรับขนาดให้พอดี นี่คือตัวอย่างรูปภาพสองภาพที่แตกต่างกัน

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

ใส่คำอธิบายภาพที่นี่

setBackgroundResource ()

ในทางกลับกันการใช้ View setBackgroundResource()ทำให้ทรัพยากรรูปภาพถูกยืดออกเพื่อให้เต็มมุมมอง

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

ใส่คำอธิบายภาพที่นี่

ทั้งสอง

ภาพพื้นหลังของ View และภาพของ ImageView จะวาดแยกกันดังนั้นคุณจึงสามารถตั้งค่าทั้งสองอย่างได้

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

ใส่คำอธิบายภาพที่นี่


1
โปรดทราบสิ่งต่อไปนี้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


13

ใน XML ของคุณสำหรับมุมมองภาพซึ่งคุณได้android:background="@drawable/thumbs_down เปลี่ยนสิ่งนี้เป็นandroid:src="@drawable/thumbs_down"

ขณะนี้กำลังวางภาพนั้นเป็นพื้นหลังให้กับมุมมองไม่ใช่ภาพจริงในนั้น


11

ในการออกแบบ XML

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

ภาพวาดผ่านรหัส

imageview.setImageResource(R.drawable.imagename);

ภาพเซิร์ฟเวอร์

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

คุณสามารถใช้ได้

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

หรือใน java java

Drawable drawableCompat = ContextCompat.getDrawable(getContext(), R.drawable.ic_emoticon_happy)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.