วิธีสร้าง Drawable จากทรัพยากร


283

ฉันมีภาพres/drawable/test.png(R.drawable.test)
ฉันต้องการที่จะผ่านภาพนี้เพื่อฟังก์ชั่นที่ยอมรับเช่นDrawablemButton.setCompoundDrawables()

ดังนั้นฉันจะแปลงทรัพยากรรูปภาพเป็นDrawableอย่างไร

คำตอบ:


567

กิจกรรมของคุณควรมีเมธอด getResources ทำ:

Drawable myIcon = getResources().getDrawable( R.drawable.icon );

2
หากคุณต้องการให้สิ่งนี้อยู่นอกคลาสกิจกรรมคุณจะต้องหาวิธีอื่นในการเข้าถึงบริบทที่ getResources () อาศัยอยู่ คำตอบนี้แนะนำให้ส่งผ่านมันไปยังผู้สร้าง
rymo

50
ตั้งแต่ API เวอร์ชัน 21 วิธีนี้เลิกใช้แล้วและคุณควรถูกแทนที่ด้วย: Drawable drawable = ResourcesCompat.getDrawable (getResources (), page.getImageId (), null);
Boren

3
@Boren มันเหมือนกับการใช้ ContextCompat.getDrawable (นี่คือ R.drawable.icon) ;?
Zach

2
ดูเหมือนว่าคำแนะนำข้างต้นจะไม่ทำงานหาก R.drawable.icon นั้นเป็นแบบเวกเตอร์
FractalBob

4
อย่าใช้สิ่งนี้หากคุณใช้ภาพร่างเวกเตอร์ ใช้ AppCompatResources.getDrawable (บริบท, R.drawable.icon) แทน
Dhaval Patel

136

รหัสนี้เลิกใช้แล้ว:

Drawable drawable = getResources().getDrawable( R.drawable.icon );

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

Drawable drawable = ContextCompat.getDrawable(getApplicationContext(),R.drawable.icon);

11
โปรดระวังว่าสิ่งนี้จะใช้ชุดรูปแบบจากบริบทที่กำหนด หากคุณต้องการให้แน่ใจว่าไม่มีการใช้ชุดรูปแบบคุณสามารถใช้ResourcesCompat.getDrawable(getResources(), R.drawable.icon, null);(โดยที่ param ที่ 3 เป็นอินสแตนซ์ Theme ที่เป็นตัวเลือก)
vaughandroid

23

getDrawable (int id)วิธีการคิดค่าเสื่อมราคา ณ วันที่ 22 API

แต่คุณควรใช้getDrawable (int id, Resources.Theme theme)สำหรับ API 21+

รหัสจะมีลักษณะเช่นนี้

Drawable myDrawable;
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
    myDrawable = context.getResources().getDrawable(id, context.getTheme());
} else {
    myDrawable = context.getResources().getDrawable(id);
}

ทำไมไม่ส่งผ่านค่า null สำหรับ api ทุกอัน? บวก: คุณแน่ใจหรือไม่ว่า null เป็นตัวเลือกที่ดีที่สุด
jonathanrz

1
getDrawable (int id, ธีม Resources.Theme) ไม่ได้เกิดขึ้นจนกว่า API 21
Chris Stillwell

หรือgetResources().getDrawable(R.drawable.ic_warning_80dp, context?.theme)
Simon Featherstone

13

ฉันแค่อยากจะเพิ่มว่าถ้าคุณได้รับข้อความ "เลิก" เมื่อใช้ getDrawable (... ) คุณควรใช้วิธีการต่อไปนี้จากห้องสมุดสนับสนุนแทน

ContextCompat.getDrawable(getContext(),R.drawable.[name])

คุณไม่จำเป็นต้องใช้ getResources () เมื่อใช้วิธีนี้

นี่เทียบเท่ากับการทำอะไรบางอย่าง

Drawable mDrawable;
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
    mDrawable = ContextCompat.getDrawable(getContext(),R.drawable.[name]);
} else {
    mDrawable = getResources().getDrawable(R.id.[name]);
}

ใช้ได้ทั้งเวอร์ชั่น Lollipop ทั้งก่อนและหลัง


4

รับ Drawable จากทรัพยากรเวกเตอร์ไม่ว่าจะเป็นเวกเตอร์หรือไม่:

AppCompatResources.getDrawable(context, R.drawable.icon);

หมายเหตุ:
ContextCompat.getDrawable(context, R.drawable.icon);จะผลิตandroid.content.res.Resources$NotFoundExceptionสำหรับทรัพยากรเวกเตอร์


3

หากคุณพยายามดึงภาพออกมาจากมุมมองที่ตั้งค่ารูปภาพไว้

ivshowing.setBackgroundResource(R.drawable.one);

จากนั้น drawable จะส่งกลับเฉพาะค่า Null ด้วยรหัสต่อไปนี้ ...

   Drawable drawable = (Drawable) ivshowing.getDrawable();

ดังนั้นจะเป็นการดีกว่าถ้าคุณตั้งค่ารูปภาพด้วยรหัสต่อไปนี้หากคุณต้องการดึงข้อมูล drawable จากมุมมองเฉพาะ

 ivshowing.setImageResource(R.drawable.one);

เท่านั้นเราจะทำการเปลี่ยนแปลงได้อย่างแน่นอน


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