Fragment: nó là gì, fragment và FragmentManager trong Android

Tác giả: IT Sectr Đã đăng: 2026-02-22 Thời gian đọc: 7 phút

Fragment là một thành phần UI có thể tái sử dụng trong Android được nhúng vào Activity và quản lý thông qua FragmentManager. Mỗi fragment có vòng đời, layout và trạng thái riêng. Fragment đơn giản hóa việc thích ứng với các kích thước màn hình khác nhau và tái sử dụng mã. Đọc thêm trong hướng dẫn chính thức của Google.

Những điểm chính

  • Fragment — một thành phần UI bên trong Activity với vòng đời và layout riêng
  • FragmentManager — một lớp để quản lý các giao dịch fragment và ngăn xếp quay lại
  • FragmentTransaction — một thao tác nguyên tử để thêm, thay thế hoặc xóa fragment
  • Jetpack Fragment — một thư viện để tương thích ngược đến Android 1.6 (API 4)
  • ViewModel — một thành phần dùng chung để trao đổi dữ liệu giữa các fragment trong cùng một Activity

Fragment là gì?

Fragment là một thành phần giao diện người dùng mô-đun của Android đại diện cho một phần màn hình bên trong Activity. Fragment có thể quản lý layout riêng, xử lý các sự kiện vòng đời và lưu trạng thái của mình. Nhờ tính mô-đun, một fragment có thể được sử dụng trong các Activity khác nhau và trên các thiết bị khác nhau.

API Fragment xuất hiện trong Android 3.0 (Honeycomb, API 11) vào năm 2011 để hỗ trợ máy tính bảng. Trước đó, các nhà phát triển phải tạo các Activity riêng cho điện thoại và máy tính bảng. Fragment cho phép lắp ráp màn hình từ các khối độc lập. Năm 2019, Google phát hành thư viện Jetpack Fragment với khả năng tương thích ngược đến API 4.

Theo Google (2026), 80% ứng dụng trên Google Play sử dụng Fragment dưới một hình thức nào đó. Thư viện Jetpack Fragment đã được tải xuống hơn 10 tỷ lần qua Google Play Services. Fragment vẫn là một thành phần chính của kiến trúc Android ngay cả trong thời đại Jetpack Compose.

Vòng đời của Fragment

Vòng đời của Fragment phức tạp hơn Activity vì nó phụ thuộc vào trạng thái của Activity chủ. Fragment trải qua các trạng thái giống như Activity nhưng thêm các callback riêng: onAttach, onCreateView, onViewCreated, onActivityCreated, onDestroyView, onDetach.

Callback FragmentTương ứng ActivityMục đích
onAttachtrước onCreateFragment được gắn vào Activity
onCreateonCreateKhởi tạo dữ liệu không liên quan đến UI
onCreateViewonCreateTạo layout qua inflater
onViewCreatedonCreateLiên kết các phần tử UI sau khi tạo view
onDestroyViewonDestroyXóa view, giải phóng tài nguyên UI
onDetachonDestroyFragment tách khỏi Activity

So sánh vòng đời Fragment và Activity

Sự khác biệt chính của vòng đời Fragment là việc gọi onCreateView và onDestroyView giữa onCreate và onDestroy. Fragment có thể tồn tại mà không có UI (nếu onCreateView trả về null). Sau khi Activity được tạo lại, FragmentManager tự động khôi phục các fragment.

FragmentManager và giao dịch

FragmentManager là lớp trung tâm để quản lý các fragment trong Activity. Nó chịu trách nhiệm thêm, xóa, thay thế fragment, quản lý ngăn xếp quay lại và khôi phục trạng thái. FragmentManager có sẵn qua supportFragmentManager (AndroidX) hoặc fragmentManager (API cũ).

kotlin
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Fragment chưa được thêm — đang tạo
        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()
    }
}

Các giao dịch FragmentTransaction là nguyên tử. commit() lên lịch thực thi cho chu kỳ Looper tiếp theo. Để thực thi ngay lập tức, hãy sử dụng commitNow(). addToBackStack(null) thêm giao dịch vào ngăn xếp quay lại — nút quay lại sẽ hoàn tác thao tác.

Phương thức vòng đời của Fragment

Hãy xem các phương thức chính của vòng đời Fragment với ví dụ Kotlin. onCreateView tạo layout — không giống Activity, phương thức phải trả về một View. onViewCreated được gọi ngay sau đó, ở đây an toàn để tìm phần tử theo id. onDestroyView là thời điểm cuối cùng để dọn sạch tham chiếu view.

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("Chi tiết")
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}

Mẫu View Binding với _binding/binding đảm bảo rằng sau onDestroyView tham chiếu layout được đặt thành null. Truy cập binding sau khi view bị hủy sẽ gây ra NullPointerException. Google khuyến nghị mẫu này cho tất cả các fragment.

Truyền dữ liệu giữa các fragment

Để truyền dữ liệu giữa các fragment, Android cung cấp một số cơ chế. Đáng tin cậy nhất là ViewModel dùng chung, được chia sẻ giữa các fragment của cùng một Activity. Fragment Result API phù hợp cho các sự kiện một lần. Đối số Bundle dành cho dữ liệu khi tạo fragment.

kotlin
// ViewModel dùng chung cho hai fragment
class SharedViewModel : ViewModel() {
    private val _selectedItem = MutableLiveData<Item>()
    val selectedItem: LiveData<Item> = _selectedItem

    fun select(item: Item) { _selectedItem.setValue(item) }
}

// Fragment A: gửi sự kiện qua Fragment Result API
setFragmentResult("request_key", bundleOf("key" to "value"))

// Fragment B: nhận sự kiện
childFragmentManager.setFragmentResultListener("request_key", this) { requestKey, bundle ->
    val value = bundle.getString("key")
}

Fragment Result API (được thêm trong Fragment 1.3.0) thay thế setTargetFragment/onActivityResult đã lỗi thời. API an toàn về kiểu, sử dụng Bundle và không yêu cầu biết người nhận. Parent FragmentManager đóng vai trò trung gian giữa các fragment.

Fragment vs Activity: khi nào chọn gì

Lựa chọn giữa Fragment và Activity phụ thuộc vào kiến trúc ứng dụng. Fragment là bắt buộc cho bố cục thích ứng (điện thoại + máy tính bảng), cho hoạt ảnh chuyển tiếp tùy chỉnh và để sử dụng Jetpack Navigation. Activity phù hợp hơn cho các ứng dụng đơn giản với một hoặc hai màn hình.

Tiêu chíFragmentActivity
Tốc độ tạoNhanh hơn (thành phần nhẹ)Chậm hơn (tiến trình hệ thống)
Tái sử dụngCao (một fragment trong các Activity khác nhau)Thấp (mỗi màn hình có Activity riêng)
Hoạt ảnh chuyển tiếpLinh hoạt (FragmentTransaction)Hạn chế (overridePendingTransition)
Bảo toàn khi xoayTự động (trình quản lý khôi phục)Thủ công (onSaveInstanceState)
Deep LinksQua Navigation ComponentHỗ trợ gốc qua intent-filter

Jetpack Fragment và Jetpack Navigation

Cách tiếp cận hiện đại để làm việc với Fragment là Jetpack Navigation Component, thay thế việc quản lý FragmentManager thủ công. Thư viện cung cấp NavGraph (đồ thị điều hướng XML), NavHostFragment và Safe Args để truyền dữ liệu an toàn về kiểu.

Thư viện Jetpack Fragment (androidx.fragment:fragment-ktx) bao gồm FragmentResult API, DialogFragment, BottomSheetDialogFragment và tích hợp với các thành phần Lifecycle-aware. Từ năm 2026, Google khuyến nghị chỉ sử dụng Fragment qua Jetpack Navigation, không trực tiếp.

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="Danh sách">
        <action
            android:id="@+id/action_list_to_detail"
            app:destination="@+id/detailFragment" />
    </fragment>

    <fragment
        android:id="@+id/detailFragment"
        android:name=".DetailFragment"
        android:label="Chi tiết" />
</navigation>

Câu hỏi thường gặp

FragmentManager là gì?

FragmentManager là một lớp quản lý các giao dịch fragment. Nó thêm, xóa và thay thế các fragment trong vùng chứa Activity. FragmentManager khôi phục trạng thái fragment khi Activity được tạo lại và quản lý ngăn xếp quay lại.

Fragment khác Activity như thế nào?

Fragment là một phần của UI bên trong Activity, nó không thể tồn tại độc lập. Fragment sống sót qua việc Activity bị tạo lại khi xoay màn hình. Activity là một màn hình hoàn chỉnh với Lifecycle riêng, Fragment phụ thuộc vào Lifecycle của Activity.

Khi nào sử dụng Fragment thay vì Activity?

Fragment — khi màn hình bao gồm nhiều khối độc lập (tab, master-detail, thích ứng máy tính bảng). Activity — khi màn hình không có khối lặp lại. Google khuyến nghị Single Activity + nhiều Fragment.

Làm thế nào để truyền dữ liệu giữa các Fragment?

Ba cách: qua Activity cha (một ViewModel dùng chung), qua Fragment Result API (setFragmentResult), qua đối số Bundle khi tạo Fragment. ViewModel là phương pháp ưa thích vì dữ liệu được bảo toàn trong quá trình tạo lại.

Fragment Transaction là gì?

Fragment Transaction là một thao tác nguyên tử thay đổi tập hợp các fragment. FragmentManager.beginTransaction() mở một giao dịch nơi có thể gọi add, remove, replace, hide, show. Mỗi giao dịch kết thúc bằng commit() hoặc commitNow().

Tổng kết

  • Fragment là một thành phần UI có thể tái sử dụng bên trong Activity với vòng đời, layout và trạng thái riêng
  • FragmentManager quản lý các giao dịch fragment và khôi phục trạng thái của chúng khi Activity được tạo lại
  • FragmentTransaction là một thao tác nguyên tử để thêm, thay thế, xóa và ẩn fragment
  • Vòng đời Fragment bao gồm sáu callback, từ onAttach đến onDetach, với điểm bổ sung onCreateView
  • ViewModel là cách được khuyến nghị để trao đổi dữ liệu giữa các fragment trong cùng một Activity
  • Fragment Result API cung cấp truyền sự kiện một lần an toàn về kiểu giữa các fragment

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm