คุณจะได้รับวัตถุ Drawable จาก id ทรัพยากรในแพ็คเกจ Android ได้อย่างไร


156

ฉันต้องได้รับวัตถุ Drawable เพื่อแสดงบนปุ่มรูปภาพ มีวิธีใช้รหัสด้านล่าง (หรือบางอย่างเช่น) เพื่อรับวัตถุจาก android.R.drawable. * แพ็คเกจหรือไม่

ตัวอย่างเช่นถ้า drawableId คือ android.R.drawable.ic_delete

mContext.getResources().getDrawable(drawableId)

คำตอบ:


222
Drawable d = getResources().getDrawable(android.R.drawable.ic_dialog_email);
ImageView image = (ImageView)findViewById(R.id.image);
image.setImageDrawable(d);

ฉันยังพบว่าการใช้บริบทของแอปพลิเคชันนั้นดูเหมือนจะใช้งานได้ดีขอบคุณ
Blaskovicz

20
ตั้งแต่ API 22. getDrawable(int id)เลิกใช้แล้ว ใช้getDrawable(int id, Resources.Theme theme)แทน วิธีการgetTheme()ควรมีประโยชน์
Isaac Zais

1
ฉันมีข้อสงสัยเล็กน้อยในรหัสนี้ "วิธีการ getDrawable (int) จากประเภททรัพยากรถูกคัดค้าน" ตามคำตอบ SO หนึ่งข้อ 1. ใช้เมธอดหรือคลาสที่เลิกใช้แล้วใน Java หรือไม่? จากคำจำกัดความของการคัดค้าน: "องค์ประกอบของโปรแกรมที่มีคำอธิบายประกอบ @Deprecated เป็นสิ่งที่โปรแกรมเมอร์ไม่แนะนำให้ใช้โดยทั่วไปแล้วจะเป็นอันตรายหรือเพราะทางเลือกที่ดีกว่าเดิม" ทางเลือกที่ดีกว่าสำหรับสิ่งนี้คืออะไร
นักฆ่า

107

ในฐานะของAPI 21 , คุณควรใช้getDrawable(int, Theme)วิธีการแทนgetDrawable(int)ขณะที่มันช่วยให้คุณสามารถเรียกdrawableวัตถุที่เกี่ยวข้องกับโดยเฉพาะอย่างยิ่งสำหรับการที่ได้รับresource ID screen density/themeเรียกวิธีการจะเทียบเท่ากับการโทรdeprecated getDrawable(int)getDrawable(int, null)

คุณควรใช้รหัสต่อไปนี้จากไลบรารีการสนับสนุนแทน:

ContextCompat.getDrawable(context, android.R.drawable.ic_dialog_email)

ใช้วิธีนี้เทียบเท่ากับการโทร:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    return resources.getDrawable(id, context.getTheme());
} else {
    return resources.getDrawable(id);
}

context.getDrawable(id);ดูเหมือนว่าจะเทียบเท่ากับresources.getDrawable(id, context.getTheme());
ErickBergmann

สามารถทำได้ในบรรทัดเดียวถ้าคุณมีห้องสมุดสนับสนุน:ResourcesCompat.getDrawable(resources, id, context.getTheme());
k2col

9

ในฐานะของ API 21 คุณสามารถใช้:

   ResourcesCompat.getDrawable(getResources(), R.drawable.name, null);

แทน ContextCompat.getDrawable(context, android.R.drawable.ic_dialog_email)


2
คุณช่วยอธิบายคำอธิบายเพิ่มเติมสำหรับตัวเลือกได้
ไหม

3

วิธีที่ดีที่สุดคือ

 button.setBackgroundResource(android.R.drawable.ic_delete);

หรือนี่สำหรับ Drawable left และบางอย่างเช่นนั้นเป็นต้น

int imgResource = R.drawable.left_img;
button.setCompoundDrawablesWithIntrinsicBounds(imgResource, 0, 0, 0);

และ

getResources().getDrawable() เลิกใช้แล้ว


0

จาก API 21 getDrawable(int id)เลิกใช้แล้ว ดังนั้นตอนนี้คุณต้องใช้

ResourcesCompat.getDrawable(context.getResources(), R.drawable.img_user, null)

แต่วิธีที่ดีที่สุดที่จะทำคือคุณควรสร้างคลาสสามัญหนึ่งคลาสเพื่อให้สามารถวาดได้และสีเพราะถ้ามีสิ่งใดเปลี่ยนแปลงหรือคัดค้านในอนาคตคุณไม่จำเป็นต้องเปลี่ยนทุกที่ในโครงการของคุณคุณเพียงแค่เปลี่ยนวิธีนี้

object ResourceUtils {
    fun getColor(context: Context, color: Int): Int {
        return ResourcesCompat.getColor(context.getResources(), color, null)
    }

    fun getDrawable(context: Context, drawable: Int): Drawable? {
        return ResourcesCompat.getDrawable(context.getResources(), drawable, null)
    }
}

ใช้วิธีนี้เช่น:

Drawable img=ResourceUtils.getDrawable(context, R.drawable.img_user)
image.setImageDrawable(img);

0

การติดตามโซลูชันสำหรับโปรแกรมเมอร์ Kotlin (จาก API 22)

val res = context?.let { ContextCompat.getDrawable(it, R.id.any_resource }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.