Fragment trong lập trình Android – phần 2 ( Vòng đời )

(ZmikiSoft.com) – Fragment trong lập trình Android – phần 2.

Fragment (tạm dịch là Phân đoạn) không được giới thiệu là một trong các thành phần chính của Android, nhưng fragment cũng là một thành phần có vòng đời ( lifecycle) của riêng nó.

Để tạo một phân đoạn, bạn phải tạo một lớp con của Fragment (hoặc một lớp con hiện tại của nó). Lớp Fragment có mã trông rất giống một Activity. Nó chứa các phương pháp gọi lại tương tự như hoạt động, chẳng hạn như onCreate(), onStart(), onPause(), và onStop(). Trên thực tế, nếu bạn đang chuyển đổi một ứng dụng Android hiện tại để sử dụng các phân đoạn, bạn có thể chỉ cần di chuyển mã khỏi các phương pháp gọi lại của hoạt động của bạn vào các phương pháp gọi lại tương ứng của phân đoạn của bạn.

Thường thì ít nhất bạn nên triển khai các phương pháp vòng đời sau:

onCreate()
Hệ thống sẽ gọi phương pháp này khi tạo phân đoạn. Trong triển khai của mình, bạn nên khởi tạo các thành phần thiết yếu của phân đoạn mà bạn muốn giữ lại khi phân đoạn bị tạm dừng hoặc dừng hẳn, sau đó tiếp tục.
onCreateView()
Hệ thống sẽ gọi phương pháp này khi đến lúc phân đoạn vẽ giao diện người dùng của nó lần đầu tiên. Để vẽ một UI cho phân đoạn của mình, bạn phải trả về một View từ phương pháp này, đây là gốc của bố trí phân đoạn của bạn. Bạn có thể trả về giá trị rỗng nếu phân đoạn không cung cấp UI.
onPause()
Hệ thống gọi phương pháp này là dấu hiệu đầu tiên về việc người dùng đang rời khỏi phân đoạn (mặc dù không phải lúc nào cũng có nghĩa rằng phân đoạn đang bị hủy). Trường hợp này thường là khi bạn định thực hiện bất kỳ thay đổi nào vẫn cần có hiệu lực ngoài phiên của người dùng hiện thời (vì người dùng có thể không quay lại).

Phần lớn ứng dụng nên triển khai ít nhất ba phương pháp sau đối với mọi phân đoạn, nhưng có một vài phương pháp gọi lại khác mà bạn cũng nên sử dụng để xử lý các giai đoạn khác nhau trong vòng đời của phân đoạn. Tất cả phương pháp gọi lại vòng đời được đề cập chi tiết hơn trong phần về Xử lý Vòng đời của Phân đoạn.

Cũng có một vài lớp con mà bạn có thể muốn mở rộng thay vì lớp cơ bản Fragment:

DialogFragment
Hiển thị một hộp thoại trôi nổi. Sử dụng lớp này để tạo một hộp thoại là một phương án hay cho việc sử dụng các phương pháp trình trợ giúp hộp thoại trong lớp Activity, vì bạn có thể kết hợp một hộp thoại phân đoạn vào ngăn xếp của các phân đoạn được quản lý bởi hoạt động, cho phép người dùng trả về một phân đoạn bị bỏ.
ListFragment
Hiển thị một danh sách các mục được quản lý bởi một trình điều hợp (chẳng hạn như một SimpleCursorAdapter), tương tự như ListActivity. Nó cung cấp một vài phương pháp để quản lý một dạng xem danh sách, chẳng hạn như phương pháp gọi lại onListItemClick() để xử lý các sự kiện nhấp.
PreferenceFragment
Hiển thị một phân cấp các đối tượng Preference dưới dạng một danh sách, tương tự như PreferenceActivity. Điều này hữu ích khi tạo một hoạt động “thiết đặt” cho ứng dụng của bạn.

Thêm một giao diện người dùng

Phân đoạn thường được sử dụng như một phần giao diện người dùng của hoạt động và đóng góp bố trí của chính nó cho hoạt động.

Để cung cấp một bố trí cho một phân đoạn, bạn phải triển khai phương pháp gọi lại onCreateView(), phương pháp này được hệ thống Android gọi khi đến lúc phân đoạn vẽ bố trí của nó. Việc bạn triển khai phương pháp này phải trả về một View là phần gốc cho bố trí phân đoạn của bạn.

Lưu ý: Nếu phân đoạn của bạn là một lớp con của ListFragment, triển khai mặc định sẽ trả về một ListView từ onCreateView(), vì thế bạn không cần triển khai nó.

Để trả về một bố trí từ onCreateView(), bạn có thể bung nó từ một tài nguyên bố trí được định nghĩa trong XML. Để giúp bạn làm vậy, onCreateView() cung cấp một đối tượng LayoutInflater.

Ví dụ, sau đây là một lớp con của Fragment với chức năng nạp một bố trí từ tệp example_fragment.xml:

public static class ExampleFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.example_fragment, container, false);
    }
}

Thêm một phân đoạn vào một hoạt động

Thường thì một phân đoạn đóng góp một phần UI vào hoạt động chủ, nó được nhúng như một phần trong phân cấp dạng xem tổng thể của hoạt động. Có hai cách mà bạn có thể thêm một phân đoạn vào bố trí của hoạt động:

  • Khai báo phân đoạn bên trong tệp bố trí của hoạt động.Trong trường hợp này, bạn có thể chỉ định các tính chất bố trí cho phân đoạn như thể nó là một dạng xem. Ví dụ, sau đây là tệp bố trí cho một hoạt động có hai phân đoạn:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <fragment android:name="com.example.news.ArticleListFragment"
                android:id="@+id/list"
                android:layout_weight="1"
                android:layout_width="0dp"
                android:layout_height="match_parent" />
        <fragment android:name="com.example.news.ArticleReaderFragment"
                android:id="@+id/viewer"
                android:layout_weight="2"
                android:layout_width="0dp"
                android:layout_height="match_parent" />
    </LinearLayout>

    Thuộc tính android:name trong &lt;fragment&gt; sẽ chỉ định lớp Fragment để khởi tạo trong bố trí.

    Khi hệ thống tạo bố trí hoạt động này, nó sẽ khởi tạo từng phân đoạn được chỉ định trong bố trí và gọi ra phương pháp onCreateView() cho từng phân đoạn, để truy xuất bố trí của từng phân đoạn. Hệ thống sẽ chèn View được trả về bởi phân đoạn trực tiếp thế chỗ phần tử &lt;fragment&gt;.

    Lưu ý: Mỗi phân đoạn yêu cầu một mã định danh duy nhất mà hệ thống có thể sử dụng để khôi phục phân đoạn nếu hoạt động bị khởi động lại (và bạn có thể sử dụng để nắm bắt phân đoạn sẽ thực hiện giao tác, chẳng hạn như gỡ bỏ nó). Có ba cách để cung cấp ID cho một phân đoạn:

    • Cung cấp thuộc tính android:id với một ID duy nhất.
    • Cung cấp thuộc tính android:tag với một xâu duy nhất.
    • Nếu bạn không cung cấp được thuộc tính nào, hệ thống sẽ sử dụng ID của dạng xem của bộ chứa.
  • Hoặc, bằng cách lập trình, thêm phân đoạn vào một ViewGroup hiện hữu.Vào bất cứ lúc nào trong khi hoạt động của bạn đang chạy, bạn có thể thêm phân đoạn vào bố trí hoạt động của mình. Bạn chỉ cần chỉ định một ViewGroup là nơi mà bạn sẽ đặt phân đoạn vào.Để thực hiện giao tác phân đoạn trong hoạt động của mình (chẳng hạn như thêm, gỡ bỏ, hay thay thế một phân đoạn), bạn phải sử dụng các API từ FragmentTransaction. Bạn có thể nhận một thực thể của FragmentTransaction từ Activity của mình như sau:
    FragmentManager fragmentManager = getFragmentManager()
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    Sau đó, bạn có thể thêm một phân đoạn bằng cách sử dụng phương pháp add(), chỉ định phân đoạn sẽ thêm và dạng xem mà bạn sẽ chèn nó vào. Ví dụ:

    ExampleFragment fragment = new ExampleFragment();
    fragmentTransaction.add(R.id.fragment_container, fragment);
    fragmentTransaction.commit();

    Tham đối đầu tiên được chuyển cho add()ViewGroup, là nơi mà phân đoạn sẽ được đặt vào, được chỉ định bởi ID tài nguyên, và tham đối thứ hai là phân đoạn cần thêm.

    Sau khi bạn đã thực hiện các thay đổi của mình bằng FragmentTransaction, bạn phải gọi commit() để các thay đổi có hiệu lực.

Khóa học lập trình Android
Khóa học lập trình Java
Khóa học lập trình iOS
Khóa học lập trình Objective-C/Swift