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 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 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 Fragment | Tương ứng Activity | Mục đích |
|---|---|---|
| onAttach | trước onCreate | Fragment được gắn vào Activity |
| onCreate | onCreate | Khởi tạo dữ liệu không liên quan đến UI |
| onCreateView | onCreate | Tạo layout qua inflater |
| onViewCreated | onCreate | Liên kết các phần tử UI sau khi tạo view |
| onDestroyView | onDestroy | Xóa view, giải phóng tài nguyên UI |
| onDetach | onDestroy | Fragment tách khỏi 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 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ũ).
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.
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.
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, 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.
// 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.
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í | Fragment | Activity |
|---|---|---|
| Tốc độ tạo | Nhanh hơn (thành phần nhẹ) | Chậm hơn (tiến trình hệ thống) |
| Tái sử dụng | Cao (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ếp | Linh hoạt (FragmentTransaction) | Hạn chế (overridePendingTransition) |
| Bảo toàn khi xoay | Tự động (trình quản lý khôi phục) | Thủ công (onSaveInstanceState) |
| Deep Links | Qua Navigation Component | Hỗ trợ gốc qua intent-filter |
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.
<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à 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 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.
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.
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à 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
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.
Đọc thêm