มาเรียก Resource ต่างๆให้ปลอดภัยด้วย ContextCompat

Minseo Chayabanjonglerd
Fungjai
Published in
1 min readDec 6, 2018

การเรียก resource มาใช้ในบาง method ทำให้มือถือ OS รุ่นเก่าๆไม่รองรับแล้วแอปเด้งหล่ะสิ

“person using smartphone” by Christian Wiediger on Unsplash

ด้วยความที่ทุกๆแอปปฏิเสธไม่ได้เลยว่า มีการเพิ่มสีใน style และ drawable ต่างๆ เพื่อความสมบูรณ์ทางหน้าตาของแอป แต่บาง method บาง API ไม่รองรับหน่ะสิ

วันนี้เราจะเล่าเรื่องนี้แบบเบาๆ (พยายามเขียนให้สั้นที่สุด) สำหรับเรื่องนี้กันเถอะ

ปล. เรื่องทั้งหมดนี้ ขอยกความดีความชอบให้กับคุนน้องแจ็คฮับบบ

โดยสรุปสั้นๆสำหรับคนขี้เกียจอ่าน คือ ใช้ ContextCompat ซะ เพราะ ทำมาเพื่อรองรับการแสดงผลทุก Android API Level จบ

เคยไหมที่เรา set Drawable หรือเปลี่ยนสี มันจะมี warning เตือนขีดเส้นใต้แดงๆมาแบบนี้

แน่นอนถ้ากดเพื่อให้มันหายแดงจะมีเจ้าแบบนี้แน่นอน

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@RequestApi(Build.VERSION_CODES.LOLLIPOP)

ซึ่งเราปล่อยแอปไป พบว่าบางอันที่ขึ้นเตือนแบบนี้ ทำแอป crash จริง เพราะแอปเรารองรับ API level 19 ขึ้นไป และคำสั่งนี้ใช้ได้ที่ API level 21 ขึ้นไป ดังนั้นคนที่ใช้มือถือที่มี API level 19 และ 20 ก็จะ crash ไปตามระเบียบ

มาดู Use Case น้อยๆกัน

กรณีที่เป็น @TargetApi(Build.VERSION_CODES.LOLLIPOP)

ที่เจอก็จะเป็นพวก Drawable ต่างๆ เช่น ดึง icon home มาแสดงนะ ก่อนหน้านี้เรียกแบบนี้

context?.resources?.getDrawable(R.drawable.ic_home, context.theme)

ท่า ContextCompat ที่ใช้ก็ง่ายมากๆเลย แบบนี้

ContextCompat.getDrawable(context, R.drawable.ic_home)

โดย parameter ตัวแรกคือ Context และตัวที่สองคือเจ้า Drawable ที่เราต้องการใส่นั่นเอง

กรณีที่เป็น @TargetApi(Build.VERSION_CODES.M)

อันนี้เจอน้อยหน่อย เจอพวกเปลี่ยนสีเป็นหลักเลย เช่น เปลี่ยนสีพื้นหลังเป็นสีชา

resources.getColor(R.color.bg_transparent, context.theme)

ใช้ท่า ContextCompat จะเป็นดังนี้

ContextCompat.getColor(context, R.color.bg_transparent)

หลักการใช้เหมือนเดิมเลย แค่ parameter ที่สองเป็น Color เท่านั้นเอง

ส่วน Document ก็มีให้อ่านเพิ่มเติมนะ เผื่อเอาไปปรับใช้กันได้

สุดท้ายฝากร้านกันสักนิด ฝากเพจด้วยนะจ๊ะ

--

--

Minseo Chayabanjonglerd
Fungjai

Android Developer | Content Creator AKA. MikkiPastel | Web2 & Web3 Contributor