02 พฤษภาคม 2556

[Android Dev Tips] เจอปัญหา android.R หรือ R.java มีปัญหาทำยังไงดี


        หลายๆคนอาจจะเจอปัญหา R cannot be resolved to a variable กันบ่อย ซึ่งเนื่องมาจากการทำงานที่ผิดปกติของไฟล์ R.java ในโปรเจคนั้นๆ

        โดยไฟล์ R.java เป็นไฟล์ที่เก็บข้อมูลที่อยู่ในโฟลเดอร์ res ที่ทำให้เรียกใช้ R.id.xxx, R.drawable.xxx, R.layout.xxx ได้ ก็เพราะว่าเป็นการเรียกจาก R.java อีกทีนึงนั่นเอง ดังนั้นถ้า R.java มีปัญหาก็จะทำให้เรียกใช้ข้อมูลใน res ไม่ได้


        ปกติเจ้าของบล็อกไม่เคยเจอหรอก ส่วนมากจะเป็นผู้ที่หลงเข้ามาอ่านเข้ามาถามเพราะว่าเจอปัญหานี้กันมากกว่า ก็เลยลองนั่งดูสาเหตุบ้าง

        เมื่อมี Hint ขึ้นว่า Import 'R' (android) เมื่อไร ถือว่าโปรเจคมีอะไรผิดปกติทันที เพราะโดยปกติ R.java มันทำงานโดยอัตโนมัติอยู่แล้ว ไม่ต้องไปยุ่งอะไรเลย และถึงจะกด Import 'R' (android) ก็ไม่ได้ช่วยให้โปรเจคหายเออเรออยู่ดี



        ส่วนมากจะมีสาเหตุมาจากการที่มีบางอย่างไม่ถูกต้องในโฟลเดอร์ res เพราะ R.java จะอิงจากไฟล์ที่อยู่ในโฟลเดอร์ res อยู่แล้ว ถ้ามีอะไรผิดพลาดในโฟลเดอร์ดังกล่าว R.java จะทำงานไม่ได้ และหายไป

        ตัวอย่างข้างบนนี้คือ R.java หายไปแล้ว และไฟล์ Java เกิดเออเรอร์เกือบหมด ปัญหานี้ผู้ที่หลงเข้ามาอ่านจะเป็นกันบ่อย เพราะมัวแต่สนใจโค๊ด Java จนไม่ได้ดู กลายเป็นว่ามีไฟล์ XML ใน Resource เออเรอร์อยู่ ทำให้ R.java หายไปนั่นเอง ปัญหานี้ก็แค่ไปแก้เออเรอร์ที่เกิดขึ้นใน XML ให้เรียบร้อย ก็ได้แล้ว (บางทีอาจจะเกิดจากการลืมกดเซฟ Ctrl + S ทำให้โปรเจคไม่รีเฟรช)


        สาเหตุยอดนิยมอีกหนึ่งอย่างคือ กำหนดชื่อไฟล์ใน Resource ไม่ถูกต้อง


        กรณีนี้จะไม่มีเออเรอร์แจ้งที่ไฟล์ใน Resource แต่ R.java จะหายไปเลย เอาจริงๆแล้วจะมีเออเรอร์แจ้งที่หน้าต่าง Console อยู่แล้ว แต่ผู้ที่หลงเข้ามาอ่านที่มีปัญหาก็ไม่ได้สนใจที่จะอ่านนั่นเอง


        ซึ่งเออเรอร์ใน Console ก็แจ้งอยู่แล้วว่าไฟล์ในเออเรอร์อะไร โดยในตัวอย่างนี้คือเออเรอร์เพราะชื่อไฟล์ใน Resource จะตั้งชื่อได้แค่ a-z, 0-9 และ _ เท่านั้น แต่ในตัวอย่างผิด เพราะดันไปตั้งชื่อตัวพิมใหญ่นำหน้า แถมมีเครื่องหมาย - อีก ก็จึงไม่แปลกที่จะทำให้เกิดเออเรอร์แล้ว R.java หาย


        สาเหตุต่อมาไม่ค่อยจะเจอกัน เกิดจาก src และ gen มีชื่อแพคเกจไม่ตรงกันและส่วนมากก็มักจะมาจากการที่ไปแก้ไขชื่อแพคเกจไม่ถูกวิธี




        [Android Dev Tips] แก้ไข Package Name ยังไงไม่ให้ผิด

        ก็ให้ลองเปิดที่ไฟล์ AndroidManifest.xml แล้วแก้ที่ package



        จะมีหน้าต่างให้กดยืนยันเพื่อแก้ไขชื่อแพคเกจไปซะ



        ก็จะเห็นว่าเออเรอหายแล้วเพราะแก้ไขชื่อแพคเกจตรงกันแล้ว



        สำหรับบางคนแก้ไขโดยใช้วิธี Import โดยระบุชื่อแพคเกจของ gen แทน



        วิธีนี้ก็สามารถแก้ไขได้ก็จริง เพราะ R ได้ระบุไปที่ชื่อแพคเกจใน gen




        แต่เอาจริงๆแล้ววิธีนี้ไม่แนะนำ เพราะแก้ที่ปลายเหตุ ผู้ที่หลงเข้ามาอ่านควรแก้ที่ชื่อแพคเกจให้ตรงกันดีกว่า แต่ถ้าผู้ที่หลงเข้ามาอ่านลองแก้ตามแล้วก็ยังไม่หายซะที ให้ลองเปิดแพคเกจในโฟลเดอร์ gen ดูก่อนว่ามี R.java หรือไม่




        ถ้าไม่มีไฟล์ R.java อาจจะมาจากที่ไฟล์ xml มีเออเรอร์ ให้ทำการแก้ไขก่อน หนทางสุดท้ายก็คือ ลบ Import ที่เป็น android.R ออกก่อน แล้ว Clean Poject ดู แต่ถ้ายังหายอยู่ ให้สร้างโปรเจคใหม่แล้วก๊อปไฟล์ไปไว้โปรเจคใหม่ไปเลย




เหล่าพันธมิตรแอนดรอยด์

Devahoy Layer Net NuuNeoI The Cheese Factory Somkiat CC Mart Routine Artit-K Arnondora Kamonway Try to be android developer Oatrice Benz Nest Studios Kotchaphan@Medium Jirawatee@Medium Travispea@Medium