ในปัจจุบัน Fragment กลายเป็นหนึ่งใน Component สำคัญสำหรับการพัฒนาแอปบนแอนดรอยด์แล้ว บทความนี้จึงขอหยิบเรื่องราวต่าง ๆ ของ Fragment ที่จำเป็นต่อนักพัฒนามาให้อ่านกันฮะ

บทความในซีรีย์เดียวกัน

จุดกำเนิด Fragment

ในอดีตที่แอปยังไม่ได้ทำงานซับซ้อนมากนัก การพัฒนาแอปโดยใช้ Activity จึงครอบคลุมกับการทำงานในรูปแบบต่าง ๆ ได้มากพอ แต่เมื่อเข้าสู่ยุค Android 3.0 Honeycomb ที่ออกแบบมาสำหรับ Tablet ก็พบว่าการทำแอปให้รองรับทั้ง Phone และ Tablet โดยใช้แค่ Activity เพียงลำพังนั้นไม่ใช่เรื่องง่ายซักเท่าไร

ทั้งนี้ก็เพราะว่า Tablet มีพื้นที่หน้าจอขนาดใหญ่กว่า และเพื่อให้ผู้ใช้ได้สัมผัสประสบการณ์ที่ดีที่สุด แทนที่จะขยาย UI ให้ใหญ่ขึ้นตามขนาดหน้าจอ ก็แสดง UI และข้อมูลต่าง ๆ ให้ใช้งานได้สะดวกกว่าเดิม

โดยหนึ่งในนั้นคือการทำ Two Pane Layout เพื่อแสดงข้อมูลบนหน้าจอทั้ง 2 ฝั่งพร้อม ๆ กันเมื่อใช้งานบนอุปกรณ์แอนดรอยด์ที่มีหน้าจอขนาดใหญ่

และนั่นจึงเป็นที่มาที่ทำให้ทีมแอนดรอยด์สร้างสิ่งที่เรียกว่า Fragment ขึ้นมานั่นเอง

Fragment เกิดมาเพื่อตอบโจทย์บางอย่างที่ Activity ไม่สามารถทำได้

เพื่อชดเชยการทำงานบางอย่างที่ Activity ไม่สามารถทำได้ เพราะ Activity ถูกสร้างขึ้นมาเป็น View Controller ที่แสดง UI แบบเต็มพื้นที่บนหน้าจอเท่านั้น ไม่สามารถแสดงเป็นหลาย ๆ ส่วนได้ ทำได้แค่สร้าง Activity หลาย ๆ ตัวเพื่อแยกเป็นคนละหน้า

ในขณะที่ Fragment นั้น

  • ออกแบบมาให้เป็น View Controller ที่แสดง UI แค่บางส่วนบนหน้าจอได้ ทำให้บนหน้าจอสามารถมี Fragment หลาย ๆ ตัวแสดงผลร่วมกันได้ (บน Activity ตัวเดียวกัน)
  • สามารถทำงานที่ซับซ้อนได้เทียบเท่ากับ Activity เมื่อเทียบกับ Custom View ที่เหมาะกับการสร้าง UI Component ที่มีแค่ UI Logic เท่านั้น
  • สามารถแปะ (Attach) เข้าไปใน Activity และถอด (Detach) ออกจาก Activity ได้ตลอดเวลา ไม่จำเป็นต้องแสดงผลอยู่บนหน้าจอตลอดเวลา
  • มี Lifecycle ที่คล้ายกับ Activity แต่มีรายละเอียดปลีกย่อยที่เยอะกว่า เพราะแยก View Creation และ Instance Creation ออกจากกัน ทำให้รองรับรูปแบบการนำไปใช้งานได้หลากหลาย
  • เพราะ Fragment สามารถทำงานอยู่บน Activity ตัวไหนก็ได้ จึงเหมาะกับการทำงานบางอย่างที่สามารถแยกเป็น Component ย่อยได้ และ Component นั้นก็สามารถนำไปใช้ซ้ำ​(Reuseable) ในหน้าอื่น ๆ ของแอปได้ง่าย
  • ในปัจจุบัน UI Component สำเร็จรูปที่มีการทำงานซับซ้อนมากกว่าการแสดง UI ก็จะอยู่ในรูปของ Fragment เพราะนำไปใช้งานได้ง่าย เช่น DialogFragment สำหรับแสดง Dialog หรือ MapFragment สำหรับแสดงแผนที่ของ Google Maps เป็นต้น

จึงทำให้ Fragment เหมาะกับแอปที่มีการทำงานในแต่ละหน้าที่ซับซ้อน โดยแบ่งการทำงานออกเป็นหลายส่วนตาม UI ที่แสดงผล แล้วให้ Fragment แต่ละตัวทำหน้าที่ของตัวเอง หรือส่งข้อมูลข้ามไปมาระหว่าง Fragment ก็ทำได้เช่นกัน

ยกตัวอย่างเช่น แถบข้อมูลผู้ใช้แอปที่สามารถ Sync ข้อมูลจาก Web Server เพื่อให้ได้ข้อมูลที่ใหม่ล่าสุด และอาจจะอยู่ในหน้าอื่น ๆ บางหน้าด้วย

Fragment มีให้เรียกใช้งาน 2 แบบ

ในการใช้งาน Fragment สิ่งที่ควรระวังคือการเรียกใช้งาน Fragment ผิดตัว เพราะบนแอนดรอยด์จะมีคลาส Fragment ให้เรียกใช้งานทั้งหมด 2 ตัวด้วยกัน

  • Fragment ของ Android Framework API (android.app.Fragment)
  • Fragment ของ AndroidX (androidx.fragment.app.Fragment)

แน่นอนว่านักพัฒนาก็ควรใช้ Fragment ของ AndroidX นั่นเอง ถึงแม้ว่าเดิมทีจะเกิดขึ้นมาเพื่อช่วยเรื่อง Backward Compatibility ก็ตาม แต่การใช้ Fragment ของ AndroidX จะมีข้อดีตรงที่มีความสามารถเหมือนกันไม่ว่าจะทำงานบนแอนดรอยด์เวอร์ชันใดก็ตาม อีกทั้งยังมีทีมแอนดรอยด์ที่คอยช่วยแก้ปัญหาให้ด้วย

ดังนั้นบทความของเจ้าของบล็อกที่เกี่ยวกับ Fragment ทั้งหมดจะพูดถึง Fragment ของ AndroidX นะครับ

ใช้ Context จาก Activity ที่เป็น Host

Fragment ไม่ได้สร้างขึ้นมาจาก ContextWrapper แบบ Activity จึงทำให้ Fragment ไม่มี Context ในตัวมันเอง ทำให้การเรียกใช้ Context ใน Fragment จะเป็น Context ของ Activity ที่เป็น Host ให้กับ Fragment ตัวนั้น ๆ เสมอ

สรุป

จากที่เล่ามาทั้งหมดนี้ จึงทำให้ Fragment กลายเป็นหนึ่งในพื้นฐานที่นักพัฒนาแอนดรอยด์ควรรู้และใช้งานเป็น ถึงแม้ว่าจะไม่ได้เป็น App Component พื้นฐานอย่าง Activity ก็ตาม

เพราะการพัฒนาแอปในปัจจุบันมีโอกาสที่จะต้องพัฒนารูปแบบการทำงานที่ซับซ้อนมากขึ้นเรื่อย ๆ ตามความต้องการของตลาดและตอบโจทย์กับธุรกิจ ดังนั้นการใช้ Fragment จึงกลายเป็นหนึ่งในเทคนิคพื้นฐานที่จะช่วยให้นักพัฒนาสามารถจัดการกับโค้ดมากมายที่อยู่ในแอปของเราได้ง่ายขึ้นนั่นเอง