Fragment: คืออะไร, แฟรกเมนต์และ FragmentManager ใน Android

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-02-22 เวลาอ่าน: 7 นาที

Fragment คือคอมโพเนนต์ UI ที่นำกลับมาใช้ใหม่ได้ใน Android ซึ่งฝังอยู่ใน Activity และจัดการผ่าน FragmentManager แต่ละแฟรกเมนต์มีวงจรชีวิต เลย์เอาต์ และสถานะของตัวเอง Fragment ช่วยให้การปรับให้เข้ากับขนาดหน้าจอต่างๆ และการนำโค้ดกลับมาใช้ใหม่ทำได้ง่ายขึ้น อ่านเพิ่มเติมใน คู่มืออย่างเป็นทางการของ Google

ประเด็นสำคัญ

  • Fragment — คอมโพเนนต์ UI ภายใน Activity ที่มีวงจรชีวิตและเลย์เอาต์ของตัวเอง
  • FragmentManager — คลาสสำหรับจัดการธุรกรรมแฟรกเมนต์และแบ็กสแต็ก
  • FragmentTransaction — การดำเนินการแบบอะตอมมิกสำหรับเพิ่ม แทนที่ หรือลบแฟรกเมนต์
  • Jetpack Fragment — ไลบรารีสำหรับความเข้ากันได้ย้อนหลังจนถึง Android 1.6 (API 4)
  • ViewModel — คอมโพเนนต์ที่ใช้ร่วมกันสำหรับการแลกเปลี่ยนข้อมูลระหว่างแฟรกเมนต์ใน Activity เดียวกัน

Fragment คืออะไร?

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

วงจรชีวิตของ Fragment ซับซ้อนกว่า Activity เนื่องจากขึ้นอยู่กับสถานะของ Activity โฮสต์ Fragment ผ่านสถานะเดียวกับ Activity แต่เพิ่ม callback ของตัวเอง: onAttach, onCreateView, onViewCreated, onActivityCreated, onDestroyView, onDetach

Callback ของ Fragmentเทียบเท่าใน Activityวัตถุประสงค์
onAttachก่อน onCreateFragment แนบกับ Activity
onCreateonCreateการเริ่มต้นข้อมูลที่ไม่ใช่ UI
onCreateViewonCreateการสร้างเลย์เอาต์ผ่าน inflater
onViewCreatedonCreateการผูกองค์ประกอบ UI หลังจากสร้างวิว
onDestroyViewonDestroyการลบวิว ปล่อยทรัพยากร UI
onDetachonDestroyFragment หลุดจาก Activity

เปรียบเทียบวงจรชีวิตของ Fragment และ Activity

ความแตกต่างหลักของ วงจรชีวิตของ Fragment คือการเรียก onCreateView และ onDestroyView ระหว่าง onCreate และ onDestroy Fragment สามารถอยู่ได้โดยไม่มี UI (ถ้า onCreateView คืนค่า null) หลังจาก Activity ถูกสร้างใหม่ FragmentManager จะกู้คืนแฟรกเมนต์โดยอัตโนมัติ

FragmentManager และธุรกรรม

FragmentManager คือคลาสหลักสำหรับจัดการแฟรกเมนต์ใน Activity โดยรับผิดชอบการเพิ่ม ลบ แทนที่แฟรกเมนต์ การจัดการแบ็กสแต็ก และการกู้คืนสถานะ FragmentManager สามารถเข้าถึงได้ผ่าน supportFragmentManager (AndroidX) หรือ fragmentManager (API เก่า)

kotlin
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

มาดูเมธอดหลักของ วงจรชีวิตของ Fragment พร้อมตัวอย่างใน Kotlin onCreateView สร้างเลย์เอาต์ — ต่างจาก Activity ตรงที่เมธอดต้องคืนค่า View onViewCreated ถูกเรียกทันทีหลังจากนั้น ที่นี่ปลอดภัยที่จะค้นหาองค์ประกอบด้วย id onDestroyView เป็นช่วงเวลาสุดท้ายในการล้างการอ้างอิงวิว

kotlin
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 สำหรับข้อมูลเมื่อสร้างแฟรกเมนต์

kotlin
// 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 vs Activity: เมื่อใดควรเลือกอะไร

การเลือกระหว่าง Fragment และ Activity ขึ้นอยู่กับสถาปัตยกรรมของแอปพลิเคชัน Fragment จำเป็นสำหรับเลย์เอาต์แบบปรับได้ (โทรศัพท์ + แท็บเล็ต) สำหรับแอนิเมชันการเปลี่ยนภาพแบบกำหนดเอง และสำหรับการใช้ Jetpack Navigation Activity เหมาะสำหรับแอปอย่างง่ายที่มีหน้าจอหนึ่งหรือสองจอ

เกณฑ์FragmentActivity
ความเร็วในการสร้างเร็วกว่า (คอมโพเนนต์น้ำหนักเบา)ช้ากว่า (กระบวนการระบบ)
การนำกลับมาใช้ใหม่สูง (แฟรกเมนต์เดียวใน Activity ต่างๆ)ต่ำ (แต่ละหน้าจอมี Activity ของตัวเอง)
แอนิเมชันการเปลี่ยนภาพยืดหยุ่น (FragmentTransaction)จำกัด (overridePendingTransition)
การรักษาเมื่อหมุนอัตโนมัติ (ผู้จัดการกู้คืน)ด้วยตนเอง (onSaveInstanceState)
Deep Linksผ่าน Navigation Componentรองรับดั้งเดิมผ่าน intent-filter

Jetpack Fragment และ Jetpack Navigation

แนวทางที่ทันสมัยในการทำงานกับ 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 เท่านั้น ไม่ใช่โดยตรง

xml

<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 คืออะไร?

FragmentManager คือคลาสที่จัดการธุรกรรมแฟรกเมนต์ โดยเพิ่ม ลบ และแทนที่แฟรกเมนต์ในคอนเทนเนอร์ของ Activity FragmentManager กู้คืนสถานะของแฟรกเมนต์เมื่อ Activity ถูกสร้างใหม่และจัดการแบ็กสแต็ก

Fragment ต่างจาก Activity อย่างไร?

Fragment คือส่วนหนึ่งของ UI ภายใน Activity ไม่สามารถอยู่ได้อย่างอิสระ Fragment อยู่รอดเมื่อ Activity ถูกสร้างใหม่เมื่อหมุนหน้าจอ Activity คือหน้าจอเต็มที่มี Lifecycle ของตัวเอง Fragment ขึ้นอยู่กับ Lifecycle ของ Activity

เมื่อใดควรใช้ Fragment แทน Activity?

Fragment — เมื่อหน้าจอประกอบด้วยหลายบล็อกอิสระ (แท็บ, master-detail, การปรับสำหรับแท็บเล็ต) Activity — เมื่อหน้าจอไม่มีบล็อกที่ทำซ้ำได้ Google แนะนำ Single Activity + หลาย Fragment

จะถ่ายโอนข้อมูลระหว่าง Fragment ได้อย่างไร?

สามวิธี: ผ่าน Activity หลัก (ViewModel ที่ใช้ร่วมกัน) ผ่าน Fragment Result API (setFragmentResult) ผ่านอาร์กิวเมนต์ Bundle เมื่อสร้าง Fragment ViewModel เป็นวิธีที่แนะนำเนื่องจากข้อมูลจะถูกเก็บรักษาไว้ระหว่างการสร้างใหม่

Fragment Transaction คืออะไร?

Fragment Transaction คือการดำเนินการแบบอะตอมมิกที่เปลี่ยนแปลงชุดแฟรกเมนต์ FragmentManager.beginTransaction() เปิดธุรกรรมที่สามารถเรียก add, remove, replace, hide, show ได้ แต่ละธุรกรรมจบลงด้วย commit() หรือ commitNow()

สรุป

  • Fragment คือคอมโพเนนต์ UI ที่นำกลับมาใช้ใหม่ได้ภายใน Activity ที่มีวงจรชีวิต เลย์เอาต์ และสถานะของตัวเอง
  • FragmentManager จัดการธุรกรรมแฟรกเมนต์และกู้คืนสถานะเมื่อ Activity ถูกสร้างใหม่
  • FragmentTransaction คือการดำเนินการแบบอะตอมมิกสำหรับเพิ่ม แทนที่ ลบ และซ่อนแฟรกเมนต์
  • วงจรชีวิตของ Fragment ประกอบด้วย callback หกตัว ตั้งแต่ onAttach ถึง onDetach พร้อมจุดเพิ่มเติม onCreateView
  • ViewModel เป็นวิธีที่แนะนำในการแลกเปลี่ยนข้อมูลระหว่างแฟรกเมนต์ใน Activity เดียวกัน
  • Fragment Result API ให้การถ่ายโอนเหตุการณ์ครั้งเดียวที่ปลอดภัยด้านชนิดระหว่างแฟรกเมนต์

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม