Start a Fragment for results ใน Android?

shaking-hands-fragment

“Google ได้เพิ่มความสามารถใหม่ให้ FragmentManager ซึ่งทำให้ FragmentManager นั้นเป็นเหมือนตัวกลางเก็บ Fragment Results”

💁‍♂️ Source code ใน project นี้ทั้งหมดสามารถดูได้ที่ https://github.com/BenBoonya/fragment-result

ในการทำงานกับ Android Development ทุกคนน่าจะเคยใช้และคุ้นเคยกับ startActivityForResult กันดี โดยเราเรียกใช้ function นี้ใน Activity หรือ Fragment เพื่อเริ่ม Activity ใหม่และเอา Result กลับมาจาก Activity นั้น แต่ถ้า Screen ต่างๆใน Application ของเราสร้างด้วย Fragment เพียงอย่างเดียวล่ะ? เช่นนั้นแน่นอนว่าเราก็ไม่สามารถใช้ startActivityForResult เพื่อส่งข้อมูลระหว่าง Fragment ได้

จนถึงเมื่อเร็วๆนี้ ถ้าเราต้องการสื่อสารระหว่าง Fragment ด้วยกัน ตัว Framework ยังไม่มีอะไรเหมือน startActivityForResult เพื่อทำหน้าที่นั้น ดังนั้นก่อนหน้านี้ผู้เขียนจึงสร้าง ViewModel ขึ้นมาและ share ViewModel นั้นระหว่าง Fragment เพื่อใช้เป็นตัวกลางในการสื่อสาร

แต่ตอนนี้ Google ได้เพิ่มความสามารถให้ Fragment และเรามีสองวิธีที่จะส่งข้อมูลระหว่าง วิธีแรกใช้ FragmentManager และวิธีที่สองใช้ Navigation Component Library

มาดูกันว่าเราจะใช้ความสามารถใหม่นี้กันอย่างไร? เพื่อให้เห็นภาพชัดเจนยิ่งขึ้นขอยกตัวอย่าง Note Application ง่ายๆ ที่ประกอบไปด้วย Fragment 2 ตัว Fragment แรกแสดงรายการ note และ Fragment ที่สองใช้สำหรับเพิ่ม note เข้าไปในรายการ

มาเริ่มจากการใส่ dependencies ที่สำคัญกันก่อนเลย feature ของ Fragment ที่กล่าวถึงนี้ปรากฎขึ้นครั้งแรกใน lib version 1.3.0 ช่วง alpha. ซึ่งตอนนี้ก็เป็น version 1.3.0-rc01 แล้ว

Navigation graph ของ project จะหน้าตาประมานนี้

note-app-nav-graph

วิธีแรกใช้ FragmentManager

Source code แบบใช้ Fragment Manager ดูที่ branch นี้ https://github.com/BenBoonya/fragment-result/tree/using-fragment-manager

ความสามารถใหม่ใน FragmentManager ทำให้ FragmentManager นั้นเป็นเหมือนตัวกลางเก็บ Fragment Results ได้ถึงแม้ว่า function จะไม่ได้ถูกตั้งชื่อว่า startFrgamentForResult แต่การทำงานนั้นก็ใกล้เคียงกับ startActivityForResult เลย ด้วยโค้ดด้านล่างนี้เราสามารถส่งข้อมูลไปมาระหว่าง Fragment ได้ง่ายดาย

สำหรับ NoteListFragment เพื่อที่จะเอา Result จาก AddNoteFragment เราต้อง set result listener ไว้ ทีนี้มาลองดูโค้ดใน NoteListFragment. กัน

อย่างที่เห็นว่าจะมี extension function ชื่อ setFragmentResultListener และเราจะได้ result กลับมาในรูปแบบของ bundle ลองไปดูต่อที่ AddNoteFragment เราต้อง set result ใน fragment นี้และเราสามารถทำได้ง่ายๆตามวิธีด้านล่าง

แต่สิ่งหนึ่งที่ควรคำนึงถึงคือ เราต้อง set result บน FragmentManager เดียวกันโดยใช้ requestKey เหมือนกัน ถ้าลองมองละเอียดขึ้นมาใน extension ของ. setFragmentResult และ setFragmentResultListener จะเห็นว่า ทั้งสอง function เรียกบน parentFragmentManager ดังโค้ดด้านล่างนี้

อีกสิ่งนึงที่ควรกล่าวถึงคือ ถ้าเราเรียก setFragmentResult ใน AddNoteFragment มากกว่า 1 ครั้ง ระบบจะส่ง result ตัวล่าสุดไปที่ NoteListFragment ก่อนที่ AdddNoteFragment จะถูก popped off จาก back stack

ถ้า AddNoteFragment เป็น child fragment ของ NoteListFragment เราก็แค่ต้อง set listener และ result ไปที่. childFragmentManager แทน parentFragmentManager

วิธีที่สองใช้ Navigation component library

Source code branch ที่ใช้ navigation component  https://github.com/BenBoonya/fragment-result/tree/using-navigation-component

การที่ส่งค่ากลับไปที่ destination ก่อนหน้า Navigation Component ใช้ SavedStateHandle ซึ่งสามารถเก็บข้อมูลแบบ key – value map ที่จะไม่หายไปเวลาเกิด Configuration change ขึ้น ทีนี้มาดูตัวอย่างโค้ดกัน

NoteListFragment

saveStateHandle จะให้ค่าออกมาเป็น LiveData และเราสามารถ observe ที่ LiveData เพื่อเอา value ได้

นี่คือวิธีการ set value ลงไปที่ savedStateHandle สำหรับ previous back stack fragment ซึ่งก็หมายถึง NoteListFragment นั่นเอง

สรุป

ในความเห็นของผู้เขียนคิดว่าใน Single Activity Architecture ที่ Screen ส่วนใหญ่นั้นคือ Fragment feature ใหม่ที่เพิ่มเข้ามาในตระกูล Fragment นี้ทำให้การทำงานกับ Fragment ง่ายขึ้นมากทีเดียว

เมาส์ไร้สาย 2023

เม้าส์ สุขภาพ ยี่ห้อไหนดี? 5 เม้าส์ไร้สายคุณภาพเยี่ยม ถนอมข้อมือ

เม้าส์ สุขภาพ ยี่ห้อไหนดี? 5 รายการ เมาส์ถนอมข้อมือ เวลาจะเลือกซื้อเมาส์ หลายๆคนคงมีคำถามว่า เราควรจะใช้ เม้าส์...

Read More
ขาตั้งจอคอม-2-จอและอื่นๆ

ทำไมเราต้องใช้ขาแขวนจอคอม? 9 อันดับขา แขวน จอ คอมคอมคุณภาพเยี่ยม

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

Read More
ขาจับจอคอม คุณภาพสูง

ทำไมเราต้องใช้ขาจับจอคอม? 9 อันดับขาจับจอคอมคุณภาพเยี่ยม

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

Read More
โต๊ะ ทํางาน ออฟฟิศ

5 โต๊ะ ทํางาน ออฟฟิศ ที่ดีที่สุด: เพื่อประสิทธิภาพการทำงานและความสบายสูงสุด

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

Read More

Leave a Comment

Your email address will not be published. Required fields are marked *