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

Android Dec 6, 2018

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

Photo by Christian Wiediger / 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 ก็มีให้อ่านเพิ่มเติมนะ เผื่อเอาไปปรับใช้กันได้

ContextCompat | Android Developers
In API level 11 (Android 3.0/Honeycomb) the recommended conventions for app navigation using the back key changed. The…developer.android.com


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

อย่าลืมกด like กด share บทความกันด้วยนะคะ :)

Posted by MikkiPastel on Sunday, 10 December 2017

Tags

Minseo Chayabanjonglerd

I am a full-time Android Developer and part-time contributor with developer community and web3 world, who believe people have hard skills and soft skills to up-skill to da moon.