วิธีล้าง ImageView ใน Android


277

ฉันกำลังนำImageViewของกลับมาใช้ใหม่เพื่อการแสดง แต่ในบางครั้งฉันก็ไม่มีค่าที่จะนำมาใช้

ดังนั้นวิธีการล้างImageViewใน Android?

ฉันพยายามแล้ว:

mPhotoView.invalidate();
mPhotoView.setImageBitmap(null);

ไม่มีใครในมุมมองที่ถูกล้างมันยังคงแสดงภาพก่อน


1
ฉันขอแนะนำให้โหลดภาพเริ่มต้นเมื่อคุณไม่มีค่า
Praveen

3
ฉันไม่มีภาพเริ่มต้นเป็นเพียงพื้นหลัง ฉันต้องการพื้นหลัง
Pentium10

ฉันคิดว่าคำตอบที่ยอมรับต้องเปลี่ยนที่นี่ มีบทบัญญัติใด ๆ เกี่ยวกับสแต็คโอเวอร์โฟลว์ในการเปลี่ยน / ย้ายคำตอบที่ยอมรับไปยังคำตอบจริง (หรือคำตอบที่ดีกว่า) จากคำตอบ 'การแก้ปัญหา'? เพราะผู้ใช้จำนวนมาก (เช่นฉัน) สามารถไปรับการยอมรับมากกว่าคำตอบที่ดีกว่า
Shirish Herwade

1
@ShirishHerwade ok เปลี่ยนแล้ว
Pentium10

ฉันกำลังเผชิญปัญหาเดียวกันฉันทำเช่นนี้: stackoverflow.com/a/50448536/5697474
Syed Danish Haider

คำตอบ:


540

ฉันเคยทำกับโซลูชันdennis.sheppard :

viewToUse.setImageResource(0);

มันใช้งานได้ แต่มันไม่ได้ทำเป็นเอกสารดังนั้นมันจึงไม่ชัดเจนว่ามันจะมีผลกับสิ่งอื่นในมุมมอง (คุณสามารถตรวจสอบรหัส ImageViewถ้าคุณชอบฉันไม่ได้)

ฉันคิดว่าทางออกที่ดีที่สุดคือ:

viewToUse.setImageResource(android.R.color.transparent);

ฉันชอบวิธีนี้สาเหตุส่วนใหญ่ไม่มีอะไรยุ่งยากในการคืนค่าสถานะและก็ชัดเจนว่ากำลังทำอะไรอยู่


3
ฉันคิดว่าการใช้ setImageResource พร้อมตัวระบุสีจะทำให้คุณมีปัญหาการขัดข้องบน Android 2.2.1
Blundell

2
สำหรับฉันทำงาน viewToUse.setImageResource (android.R.color.transparent); รหัส
Javier

3
ระวังสิ่งนี้ถ้าคุณมีทรัพยากรที่มี id 0 จริง ๆ แล้วสิ่งนี้จะทำให้ชุดของคุณเป็นรูปวาดของคุณ ไม่แน่ใจว่าโอกาสที่จะมีรหัสนั้นเป็นอย่างไร ..
Chris

1
ฉันมีปัญหากับ setImageResource (0) - ไม่ได้ผลเสมอไป แต่การตั้งค่าเป็นแบบโปร่งใสมีความน่าเชื่อถือมาก ขอบคุณ!
Scott Biggs

6
viewToUse.setImageResource(0);ไม่ทำงาน แต่ใช้viewToUse.setImageResource(android.R.color.transparent);งานได้
zionpi

119

ฉันมีปัญหาที่คล้ายกันซึ่งฉันต้องลบ ImageViews ออกจากหน้าจอโดยทั่วไป บางคำตอบที่นี่ทำให้ฉันไปในทิศทางที่ถูกต้อง แต่ท้ายที่สุดแล้วการเรียก setImageDrawable () ได้ผลสำหรับฉัน:

imgView.setImageDrawable(null);

(ดังที่กล่าวไว้ในความคิดเห็นการใช้งานดังกล่าวมีการบันทึกไว้ในเอกสารอย่างเป็นทางการ: ImageView # setImageDrawable )


3
สิ่งนี้ใช้ได้อย่างน้อยในแอพของฉัน setImageResource (0) ใช้งานได้ในบางครั้ง
ฮง

5
หากคุณได้ตั้งภาพโดยใช้ setImageBitmap นี้คือสิ่งที่คุณต้องการ
เควินปาร์คเกอร์

นี่คือความคิดของฉันคำตอบที่ดีที่สุด! มันสะอาดถูกต้องและสั้นมาก ไม่จำเป็นต้องกำหนด drawable เปล่าและใช้มันหรือสิ่งที่ต้องการ
Potaito

คำตอบนี้ใช้งานได้จริงอย่างน่าเชื่อถือ! และเป็นโพสต์แรกสุดที่ระบุรหัสนี้เป็นวิธีแก้ปัญหา ดังนั้นฉัน upvoted หนึ่งนี้และไม่โพสต์อื่น ๆ ด้วยคำตอบเดียวกัน
Android ดั้งเดิม

2
คำตอบนี้ได้รับการบันทึกไว้ในเอกสารอย่างเป็นทางการแล้ว: developer.android.com/reference/android/widget/ …

79

ฉันรู้ว่านี่เก่า แต่ฉันก็สามารถทำสิ่งนี้ได้ด้วย

viewToUse.setImageResource(0);

ดูเหมือนจะไม่ได้ผล แต่ฉันก็ลองด้วยความตั้งใจและมันก็ทำงานได้อย่างสมบูรณ์


2
ที่จริงแล้วตั้งเป็นทรัพยากรรูปภาพที่ไม่ถูกต้อง (-1, 45, ฯลฯ )
dvallejo

8
ไม่การตั้งค่าเป็น -1 ให้ android.content.res.Resources $ NotFoundException 0 ดูเหมือนว่าจะทำงาน
NateS

28
กรณีนี้เมื่อคุณเลื่อนมุมมองรายการของคุณ อย่างใด imageview ที่ตั้งค่าเป็น 0 จะแสดงภาพที่ไม่ถูกต้อง (มันจะแสดงภาพจาก imageview อื่น) ดังนั้นความละเอียดด้านล่างสามารถทำได้ viewToUse.setImageResource (android.R.color.transparent);
ไม้ A.Suk

3
ฉันได้รับข้อผิดพลาดนี้ครั้งเดียวเมื่อลองใช้วิธีนี้: "android.content.res.Resources $ NotFoundException: รหัสทรัพยากร # 0x0" ดังนั้นดูเหมือนว่าการตั้งค่ารูปภาพเปล่าเป็นวิธีที่ดีที่สุดในการ "ล้าง" ImageView
Pavel Alexeev

16

ดูเหมือนสิ่งที่คุณต้องการคือรูปภาพเริ่มต้นเพื่อตั้งค่า ImageView ของคุณเมื่อไม่แสดงรูปภาพอื่น นี่คือวิธีที่แอปพลิเคชันผู้ติดต่อใช้งาน:

if (photoId == 0) {
    viewToUse.setImageResource(R.drawable.ic_contact_list_picture);
} else {
    // ... here is where they set an actual image ...
}

67
ไม่ฉันไม่ต้องการสิ่งนี้ ฉันต้องการเพียงแค่ล้างเนื้อหา ผู้ใช้อาจเลือกภาพใหม่หลังจาก
Pentium10

3
แอพ Contacts เป็นโอเพ่นซอร์ส ( android.git.kernel.org/?p=platform/packages/apps/… ) ฉันตรวจสอบซอร์สโค้ด ปรากฎว่าพวกเขากำลังใช้ QuickContactBadge (subclass ของ ImageView) และเมื่อพวกเขาไม่มีรูปถ่ายพวกเขาใช้ setImageResource เพื่อตั้งค่ารูปภาพเริ่มต้น ตรวจสอบรายละเอียด com.android.contacts.ContactsListActivity # ContactItemListAdapter โดยเฉพาะอย่างยิ่งใน getView ()
Dan Lew

9
ทำไมคุณถึงตรวจสอบคำตอบนั้นเป็นคำตอบที่ถูกต้องหากไม่ใช่สิ่งที่คุณต้องการ?
arniotaki

3
Daniel มีหลายเหตุผลว่าทำไมผู้คนถึงต้องการภาพที่ชัดเจน
K - ความเป็นพิษใน SO กำลังเพิ่มขึ้น

1
เขาไม่ต้องการภาพเริ่มต้น เขาต้องการให้มันถูกล้างออก
EpicPandaForce

13

ฉันพยายามทำเช่นนี้เพื่อล้าง Image และ DrawableCache ใน ImageView

ImgView.setImageBitmap(null);
ImgView.destroyDrawingCache();

ฉันหวังว่าสิ่งนี้จะได้ผลสำหรับคุณ!


9

หากไม่มีวิธีการใดในการล้างภาพที่คุณได้ตั้งค่าไว้ (โดยเฉพาะsetImageResource(0)หรือsetImageResources(android.R.color.transparent)ตรวจสอบเพื่อให้แน่ใจว่าภาพปัจจุบันไม่ได้ถูกตั้งค่าเป็นพื้นหลังโดยใช้setBackgroundDrawable(...)หรือสิ่งที่คล้ายกัน

รหัสของคุณจะตั้งค่าทรัพยากรรูปภาพในเบื้องหน้าเป็นสิ่งที่โปร่งใสต่อหน้าภาพพื้นหลังที่คุณตั้งไว้และจะยังคงแสดง


6

เฮ้ฉันรู้ว่าฉันสายเกินไปที่จะตอบคำถามนี้ แต่แค่คิดว่าฉันต้องแชร์สิ่งนี้

วิธีการโทรเมื่อคุณรีเซ็ตภาพจะต้องเป็นวิธีเดียวกับที่คุณเรียกขณะที่คุณตั้งค่า

เมื่อคุณต้องการรีเซ็ตแหล่งรูปภาพ @ dennis.sheepardคำตอบจะทำงานได้ดีก็ต่อเมื่อคุณตั้งค่ารูปภาพในบิตแมปโดยใช้setImageResource()

เช่น

ผมเคยใช้setImageBitmap()และด้วยเหตุนี้การตั้งค่าsetImageResource(0)การทำงาน didn setImageBitmap(null)แทนผมใช้


1
คุณพูดถูกใช่แล้วฉันสังเกตเช่นเดียวกัน ฉันใช้ setImageBitmap () / setImageResource () หรือดูภาพเดียวกันขึ้นอยู่กับเงื่อนไข ดังนั้นฉันต้องใช้ setImageResource (0) / setImageBitmap (null) Alternativley เพื่อล้าง imageview ขอบคุณ!
โมนิกา M

5

ถ้าคุณใช้ร่อนคุณสามารถทำสิ่งนี้ได้

Glide.with(yourImageView).clear(yourImageView)

ขอบคุณ refig มันช่วยได้มาก
ucMedia

3

ฉันสามารถทำได้โดยกำหนด drawable (สิ่งที่ต้องการ blank_white_shape.xml):

<shape xmlns:android="http://schemas.android.com/apk/res/android"       
       android:shape="rectangle">
    <solid android:color="@android:color/white"/>
</shape>

จากนั้นเมื่อฉันต้องการล้างมุมมองภาพที่ฉันเพิ่งเรียก

 imageView.setImage(R.drawable.blank_white_shape);

มันใช้งานได้ดีสำหรับฉัน!


2

สำหรับอิมเมจรายการ ListView คุณสามารถตั้งค่าImageView.setVisibility(View.INVISIBLE)หรือImageView.setImageBitmap(null)ในรายการอะแดปเตอร์สำหรับกรณี "ไม่มีภาพ"


2

เมื่อkwasiเขียนและแก้ไขgoluคุณสามารถใช้โปร่งใสแทนสีขาว:

ไฟล์ drawable/transparent.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <solid android:color="@android:color/transparent"/>
</shape>

ภายในกิจกรรมมุมมอง ฯลฯ :

view.setImageResource(R.drawable.transparent);

1

มันใช้งานได้สำหรับฉัน

emoji.setBackground(null);

สิ่งนี้ขัดข้องในรันไทม์

viewToUse.setImageResource(android.R.color.transparent);  


0

หากคุณใช้ไลบรารีการสนับสนุนคุณจะได้รับAppCompatImageViewแทนImageViewซึ่งสนับสนุนsetImageResource(0)บนอุปกรณ์ทั้งหมดดังนั้นคุณควรใช้มันในลักษณะเดียวกับการใช้setImageDrawable(null)และsetImageBitmap(null)

มิฉะนั้นจะทำงานได้ดีเริ่มตั้งแต่ Android บางรุ่น ตามรหัสของ Android และจากการทดสอบของฉันฉันคิดว่ามันควรจะปลอดภัยที่จะใช้setImageResource(0)จาก Android API 22 (5.1) คุณสามารถดูรหัส Android ของ API 22 กับ API 21 ได้ที่นี่


0

ฉันกำลังเผชิญกับปัญหาเดียวกันฉันเปลี่ยนสีพื้นหลังของมุมมองเป็นสีพื้นหลังเค้าโครงคุณสามารถทำสิ่งนี้:

 edit_countflag.setBackgroundColor(Color.parseColor("#ffffff"));

// จากนั้นตั้งค่ารูปภาพ

edit_countflag.setImageResource(R.drawable.flag_id);

0

ฉันพยายามลบ Image of the ImageView ด้วยโดยใช้ImageView.setImageRessource(0)แต่ไม่ได้ผลสำหรับฉัน
โชคดีที่ฉันได้รับข้อความนี้ในบันทึก:

Caused by: java.lang.IllegalStateException: The specified child already has a parent. 
You must call removeView() on the child's parent first.

ดังนั้นสมมติว่าlayoutmanagerเป็นอินสแตนซ์ของคุณสำหรับเลย์เอาต์กว่าที่คุณต้องทำ:

RelativeLayout layoutManager = new RelativeLayout(this);
ImageView image = new ImageView(this);

// this line worked for me
layoutManager.removeView(image);

-1

ฉันขอชี้ให้เห็นสิ่งที่คุณพยายามตั้งและ int ที่คาดว่าจะมี drawable

คุณไม่ควรทำสิ่งต่อไปนี้หรือไม่?

imageview.setImageDrawable(this.getResources().getDrawable(R.drawable.icon_image));

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