Fragment คือคอมโพเนนต์ UI ที่นำกลับมาใช้ใหม่ได้ใน Android ซึ่งฝังอยู่ใน Activity และจัดการผ่าน FragmentManager แต่ละแฟรกเมนต์มีวงจรชีวิต เลย์เอาต์ และสถานะของตัวเอง Fragment ช่วยให้การปรับให้เข้ากับขนาดหน้าจอต่างๆ และการนำโค้ดกลับมาใช้ใหม่ทำได้ง่ายขึ้น อ่านเพิ่มเติมใน คู่มืออย่างเป็นทางการของ Google
ประเด็นสำคัญ
Fragment คือคอมโพเนนต์อินเทอร์เฟซผู้ใช้แบบโมดูลาร์ของ Android ที่แสดงส่วนหนึ่งของหน้าจอภายใน Activity Fragment สามารถจัดการเลย์เอาต์ของตัวเอง จัดการเหตุการณ์วงจรชีวิต และบันทึกสถานะของตัวเองได้ ด้วยความเป็นโมดูลาร์ แฟรกเมนต์หนึ่งสามารถใช้ใน Activity ต่างๆ และบนอุปกรณ์ต่างๆ ได้
Fragment API ปรากฏใน Android 3.0 (Honeycomb, API 11) ในปี 2011 เพื่อรองรับแท็บเล็ต ก่อนหน้านั้น นักพัฒนาต้องสร้าง Activity แยกต่างหากสำหรับโทรศัพท์และแท็บเล็ต Fragment ทำให้สามารถประกอบหน้าจอจากบล็อกอิสระได้ ในปี 2019 Google เปิดตัวไลบรารี Jetpack Fragment ที่มีความเข้ากันได้ย้อนหลังจนถึง API 4
ตามข้อมูลของ Google (2026) 80% ของแอปใน Google Play ใช้ Fragment ในรูปแบบใดรูปแบบหนึ่ง ไลบรารี Jetpack Fragment ถูกดาวน์โหลดมากกว่า 10,000 ล้านครั้งผ่าน Google Play Services Fragment ยังคงเป็นคอมโพเนนต์สำคัญของสถาปัตยกรรม Android แม้ในยุคของ Jetpack Compose
วงจรชีวิตของ Fragment ซับซ้อนกว่า Activity เนื่องจากขึ้นอยู่กับสถานะของ Activity โฮสต์ Fragment ผ่านสถานะเดียวกับ Activity แต่เพิ่ม callback ของตัวเอง: onAttach, onCreateView, onViewCreated, onActivityCreated, onDestroyView, onDetach
| Callback ของ Fragment | เทียบเท่าใน Activity | วัตถุประสงค์ |
|---|---|---|
| onAttach | ก่อน onCreate | Fragment แนบกับ Activity |
| onCreate | onCreate | การเริ่มต้นข้อมูลที่ไม่ใช่ UI |
| onCreateView | onCreate | การสร้างเลย์เอาต์ผ่าน inflater |
| onViewCreated | onCreate | การผูกองค์ประกอบ UI หลังจากสร้างวิว |
| onDestroyView | onDestroy | การลบวิว ปล่อยทรัพยากร UI |
| onDetach | onDestroy | Fragment หลุดจาก Activity |
ความแตกต่างหลักของ วงจรชีวิตของ Fragment คือการเรียก onCreateView และ onDestroyView ระหว่าง onCreate และ onDestroy Fragment สามารถอยู่ได้โดยไม่มี UI (ถ้า onCreateView คืนค่า null) หลังจาก Activity ถูกสร้างใหม่ FragmentManager จะกู้คืนแฟรกเมนต์โดยอัตโนมัติ
FragmentManager คือคลาสหลักสำหรับจัดการแฟรกเมนต์ใน Activity โดยรับผิดชอบการเพิ่ม ลบ แทนที่แฟรกเมนต์ การจัดการแบ็กสแต็ก และการกู้คืนสถานะ FragmentManager สามารถเข้าถึงได้ผ่าน supportFragmentManager (AndroidX) หรือ fragmentManager (API เก่า)
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// ยังไม่ได้เพิ่มแฟรกเมนต์ — กำลังสร้าง
if (savedInstanceState == null) {
val transaction = this.supportFragmentManager
.beginTransaction()
transaction.add(R.id.fragment_container, ListFragment())
transaction.addToBackStack(null)
transaction.commit()
}
}
fun replaceFragment(fragment: Fragment) {
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container, fragment)
.addToBackStack(null)
.commit()
}
}ธุรกรรม FragmentTransaction เป็นแบบอะตอมมิก commit() กำหนดเวลาการทำงานสำหรับรอบ Looper ถัดไป สำหรับการทำงานทันทีให้ใช้ commitNow() addToBackStack(null) เพิ่มธุรกรรมลงในแบ็กสแต็ก — ปุ่มย้อนกลับจะยกเลิกการดำเนินการ
มาดูเมธอดหลักของ วงจรชีวิตของ Fragment พร้อมตัวอย่างใน Kotlin onCreateView สร้างเลย์เอาต์ — ต่างจาก Activity ตรงที่เมธอดต้องคืนค่า View onViewCreated ถูกเรียกทันทีหลังจากนั้น ที่นี่ปลอดภัยที่จะค้นหาองค์ประกอบด้วย id onDestroyView เป็นช่วงเวลาสุดท้ายในการล้างการอ้างอิงวิว
class DetailFragment : Fragment() {
private var _binding: FragmentDetailBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentDetailBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.textTitle.setText("รายละเอียด")
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}รูปแบบ View Binding กับ _binding/binding รับประกันว่าหลังจาก onDestroyView การอ้างอิงเลย์เอาต์จะกลายเป็น null การเข้าถึง binding หลังจากวิวถูกทำลายจะทำให้เกิด NullPointerException รูปแบบนี้ได้รับการแนะนำโดย Google สำหรับแฟรกเมนต์ทั้งหมด
สำหรับ การถ่ายโอนข้อมูลระหว่างแฟรกเมนต์ Android มีกลไกหลายอย่าง ที่น่าเชื่อถือที่สุดคือ ViewModel ที่ใช้ร่วมกันระหว่างแฟรกเมนต์ของ Activity เดียวกัน Fragment Result API เหมาะสำหรับเหตุการณ์ครั้งเดียว อาร์กิวเมนต์ Bundle สำหรับข้อมูลเมื่อสร้างแฟรกเมนต์
// ViewModel ที่ใช้ร่วมกันสำหรับสองแฟรกเมนต์
class SharedViewModel : ViewModel() {
private val _selectedItem = MutableLiveData<Item>()
val selectedItem: LiveData<Item> = _selectedItem
fun select(item: Item) { _selectedItem.setValue(item) }
}
// แฟรกเมนต์ A: ส่งเหตุการณ์ผ่าน Fragment Result API
setFragmentResult("request_key", bundleOf("key" to "value"))
// แฟรกเมนต์ B: รับเหตุการณ์
childFragmentManager.setFragmentResultListener("request_key", this) { requestKey, bundle ->
val value = bundle.getString("key")
}Fragment Result API (เพิ่มใน Fragment 1.3.0) แทนที่ setTargetFragment/onActivityResult ที่เลิกใช้งานแล้ว API ปลอดภัยด้านชนิด ใช้ Bundle และไม่ต้องรู้จักผู้รับ Parent FragmentManager ทำหน้าที่เป็นตัวกลางระหว่างแฟรกเมนต์
การเลือกระหว่าง Fragment และ Activity ขึ้นอยู่กับสถาปัตยกรรมของแอปพลิเคชัน Fragment จำเป็นสำหรับเลย์เอาต์แบบปรับได้ (โทรศัพท์ + แท็บเล็ต) สำหรับแอนิเมชันการเปลี่ยนภาพแบบกำหนดเอง และสำหรับการใช้ Jetpack Navigation Activity เหมาะสำหรับแอปอย่างง่ายที่มีหน้าจอหนึ่งหรือสองจอ
| เกณฑ์ | Fragment | Activity |
|---|---|---|
| ความเร็วในการสร้าง | เร็วกว่า (คอมโพเนนต์น้ำหนักเบา) | ช้ากว่า (กระบวนการระบบ) |
| การนำกลับมาใช้ใหม่ | สูง (แฟรกเมนต์เดียวใน Activity ต่างๆ) | ต่ำ (แต่ละหน้าจอมี Activity ของตัวเอง) |
| แอนิเมชันการเปลี่ยนภาพ | ยืดหยุ่น (FragmentTransaction) | จำกัด (overridePendingTransition) |
| การรักษาเมื่อหมุน | อัตโนมัติ (ผู้จัดการกู้คืน) | ด้วยตนเอง (onSaveInstanceState) |
| Deep Links | ผ่าน Navigation Component | รองรับดั้งเดิมผ่าน intent-filter |
แนวทางที่ทันสมัยในการทำงานกับ Fragment คือ Jetpack Navigation Component ซึ่งแทนที่การจัดการ FragmentManager ด้วยตนเอง ไลบรารีมี NavGraph (กราฟนำทาง XML), NavHostFragment และ Safe Args สำหรับการถ่ายโอนข้อมูลที่ปลอดภัยด้านชนิด
ไลบรารี Jetpack Fragment (androidx.fragment:fragment-ktx) รวมถึง FragmentResult API, DialogFragment, BottomSheetDialogFragment และการรวมเข้ากับคอมโพเนนต์ Lifecycle-aware ตั้งแต่ปี 2026 Google แนะนำให้ใช้ Fragment ผ่าน Jetpack Navigation เท่านั้น ไม่ใช่โดยตรง
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:startDestination="@+id/listFragment">
<fragment
android:id="@+id/listFragment"
android:name=".ListFragment"
android:label="รายการ">
<action
android:id="@+id/action_list_to_detail"
app:destination="@+id/detailFragment" />
</fragment>
<fragment
android:id="@+id/detailFragment"
android:name=".DetailFragment"
android:label="รายละเอียด" />
</navigation>คำถามที่พบบ่อย
FragmentManager คือคลาสที่จัดการธุรกรรมแฟรกเมนต์ โดยเพิ่ม ลบ และแทนที่แฟรกเมนต์ในคอนเทนเนอร์ของ Activity FragmentManager กู้คืนสถานะของแฟรกเมนต์เมื่อ Activity ถูกสร้างใหม่และจัดการแบ็กสแต็ก
Fragment คือส่วนหนึ่งของ UI ภายใน Activity ไม่สามารถอยู่ได้อย่างอิสระ Fragment อยู่รอดเมื่อ Activity ถูกสร้างใหม่เมื่อหมุนหน้าจอ Activity คือหน้าจอเต็มที่มี Lifecycle ของตัวเอง Fragment ขึ้นอยู่กับ Lifecycle ของ Activity
Fragment — เมื่อหน้าจอประกอบด้วยหลายบล็อกอิสระ (แท็บ, master-detail, การปรับสำหรับแท็บเล็ต) Activity — เมื่อหน้าจอไม่มีบล็อกที่ทำซ้ำได้ Google แนะนำ Single Activity + หลาย Fragment
สามวิธี: ผ่าน Activity หลัก (ViewModel ที่ใช้ร่วมกัน) ผ่าน Fragment Result API (setFragmentResult) ผ่านอาร์กิวเมนต์ Bundle เมื่อสร้าง Fragment ViewModel เป็นวิธีที่แนะนำเนื่องจากข้อมูลจะถูกเก็บรักษาไว้ระหว่างการสร้างใหม่
Fragment Transaction คือการดำเนินการแบบอะตอมมิกที่เปลี่ยนแปลงชุดแฟรกเมนต์ FragmentManager.beginTransaction() เปิดธุรกรรมที่สามารถเรียก add, remove, replace, hide, show ได้ แต่ละธุรกรรมจบลงด้วย commit() หรือ commitNow()
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม