Kiến trúc và cách triển khai Fragment trong Android

Fragment đại diện cho một phần giao diện người dùng hoặc một hành vi trong một Activity. Việc sử dụng Fragment giúp ứng dụng linh hoạt hơn trong việc thiết kế giao diện đa màn hình. Dưới đây là các bước và khái niệm cơ bản để làm việc với Fragment.

Quy trình thiết lập cơ bản

  1. Xây dựng lớp dữ liệu (Model layer).
  2. Tạo Activity làm vật chứa (Host Activity).
  3. Thiết lập vị trí hiển thị Fragment trong tệp layout của Activity.
  4. Định nghĩa lớp UI Fragment (quy trình tương tự như tạo Activity).
  5. Gắn Fragment vào Activity thông qua FragmentManager vì Fragment không thể tự hiển thị độc lập.

Tương tác giữa Activity và Fragment

Activity đóng vai trò quản lý các Fragment. Để quản lý một UI Fragment, Activity cần thực hiện hai nhiệm vụ chính:

  • Xác định vùng không gian trên layout để đặt Fragment.
  • Điều phối vòng đời của các thực thể Fragment.

Có hai phương thức để nhúng Fragment vào Activity:

  • Nhúng qua tệp Layout (XML): Cách này đơn giản nhưng thiếu tính linh hoạt do cấu trúc được cố định từ đầu.
  • Sử dụng mã lập trình (Java/Kotlin): Cách này phức tạp hơn nhưng cho phép kiểm soát Fragment (thêm, xóa, thay thế) ngay trong thời gian chạy (runtime).

Sự khác biệt về vòng đời (Lifecycle)

Vòng đời của Activity do hệ điều hành quản lý trực tiếp. Ngược lại, vòng đời của Fragment hoàn toàn phụ thuộc vào Activity vật chứa. Khi Activity nhận được một sự kiện thay đổi trạng thái từ hệ thống, nó sẽ chuyển tiếp các lời gọi tương ứng đến Fragment.

Các phương thức vòng đời của Fragment thường là public để Activity có thể gọi chúng khi cần thiết, trong khi các phương thức tương đương của Activity thường là protected.

Sử dụng FrameLayout làm vật chứa

FrameLayout thường được ưu tiên chọn làm vùng chứa cho Fragment vì tính đơn giản và khả năng giữ vị trí tốt cho một View con duy nhất. Activity có thể định nghĩa nhiều FrameLayout để quản lý nhiều Fragment cùng lúc trên một màn hình.

Khởi tạo một Fragment

Để cấu hình một thực thể Fragment, chúng ta sử dụng phương thức onCreate():

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Khởi tạo các tham số không liên quan đến giao diện
}

Để xây dựng và hiển thị giao diện, Fragment sử dụng onCreateView(). Đây là nơi layout được nạp và các thành phần giao diện được liên kết:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // Nạp layout cho Fragment
    View rootView = inflater.inflate(R.layout.fragment_task_detail, container, false);

    // Ánh xạ các thành phần giao diện (UI Components)
    EditText titleInput = rootView.findViewById(R.id.edit_task_title);
    
    return rootView;
}

Trong inflater.inflate():

  • Tham số đầu tiên là ID của layout.
  • Tham số thứ hai là View cha (container).
  • Tham số thứ ba (false) chỉ định rằng không được thêm View đã nạp trực tiếp vào View cha ngay lập tức (vì việc này sẽ do Activity quản lý sau đó).

Quản lý Fragment bằng FragmentManager

FragmentManager là thành phần chịu trách nhiệm điều phối các Fragment và đưa chúng vào cây phân cấp View của Activity. Nó quản lý danh sách các Fragment đang hoạt động và một ngăn xếp (Back Stack) để hỗ trợ thao tác quay lại.

Dưới đây là cách thêm một Fragment vào Activity bằng mã nguồn:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_host);

    // 1. Truy cập FragmentManager
    FragmentManager fm = getSupportFragmentManager();

    // 2. Kiểm tra xem Fragment đã tồn tại trong container chưa
    Fragment currentFragment = fm.findFragmentById(R.id.fragment_placeholder);

    // 3. Nếu chưa có, tạo mới và thực hiện giao dịch (Transaction)
    if (currentFragment == null) {
        currentFragment = new TaskDetailFragment();
        fm.beginTransaction()
          .add(R.id.fragment_placeholder, currentFragment)
          .commit();
    }
}

Khái niệm Fragment Transaction

Một giao dịch (Transaction) là tập hợp các thao tác như thêm (add), xóa (remove), thay thế (replace), đính kèm (attach) hoặc tách rời (detach) Fragment. Đây là cơ chế cốt lõi để xây dựng giao diện người dùng động.

ID của vùng chứa (như R.id.fragment_placeholder) đóng hai vai trò quan trọng:

  • Xác định tọa độ hiển thị của Fragment trên giao diện Activity.
  • Đóng vai trò là định danh duy nhất để FragmentManager tìm kiếm lại Fragment trong danh sách quản lý.

Khi Activity bị hủy do thay đổi cấu hình (như xoay màn hình), FragmentManager sẽ tự động lưu lại danh sách các Fragment. Khi Activity được tái tạo, nó sẽ khôi phục lại trạng thái của các Fragment từ danh sách đã lưu, đảm bảo trải nghiệm người dùng không bị gián đoạn.

Thẻ: Android Fragment FragmentManager FragmentTransaction MobileDevelopment

Đăng vào ngày 13 tháng 6 lúc 03:45