Một Fragment đại diện cho một hành vi hoặc một phần của giao diện người dùng. Bạn có thể kết hợp nhiều Fragment trong một Activity duy nhất để xây dựng một giao diện người dùng đa cửa sổ. Bạn có thể nghĩ đến một Fragment như là một phần mô-đun của một Activity, trong đó nó có vòng đời riêng, có input riêng và có thể add và remove Fragment trong khi activity đang chạy. Nó như một “sub-activity”.
Một Fragment luôn luôn phải được nhúng vào trong một activity và vòng đời của Fragment bị ảnh hưởng trực tiếp bởi vòng đời hoạt động của activity chủ. Ví dụ, khi activity đang trạng thái paused, tất cả các fragment trong nó cũng bị paused, và khi activity bị destroyed, tất cả các fragment cũng bị destroyed. Tuy nhiên, trong khi một Activity đang chạy (đang trong giai đoạn sau khi gọi hàm onResume đến trước khi gọi hàm onPause), bạn có thể thao tác từng Fragment một cách độc lập, chẳng hạn như thêm hoặc loại bỏ chúng.
Khi add một Fragment vào trong một Activity layout tương tự như một View bằng cách sử dụng các thẻ tuy nhiên có thể một fragment không yêu cầu trở thành một phần giao diện của activity, bạn có thể sử dụng fragment mà nó không có UI như một thành phần vô hình của activity.
Tạo một Fragment
Khi tao một Fragment phải tạo một subclass của Fragment, class Fragment này có code gần giống như một Activity. Nó cũng gọi một số methods tương tự activity như onCreate(), onStart(), onPause(), and onStop(). Trong thực tế, có thế convert một ứng dụng Android sang sử dụng fragment, có thế move code gọi từ activity sang gọi từ fragment.
Sau đây là lifecycle của một Fragment.
Thông thường phải implement ít nhất một trong ba method sau:
– onCreate() gọi khi tạo fragment, trong method này bạn nên khởi tạo các component cần thiết của fragment mà bạn muốn giữ lại khi fragment đang paused hoặc stopped sau đó resumed.
– onCreateView() gọi khi fragment hiển thị giao diện lần đầu. Để draw UI cho fragment bạn phải trả về một View từ chính methods này. Bạn có thể trả về null nếu fragment không cung cấp một UI.
– onPause() gọi khi người dùng rời khỏi fragment (không có nghĩa fragment bị destroyed). Nơi bạn thực hiện bất kỳ sự thay đổi nào lên trên session hiện tại.
Có một số subclass bạn muốn kế thừa từ Fragment class:
– DialoFragment: Sử dụng để tạo dialog.
– ListFragment: cung cấp các methods chung để quản lý listview.
– PreferenceFragment tương tự như FreferenceActivity, rất hữu dụng để tạo “setting” cho ứng dụng.
Thêm giao diện cho Fragment.
Để thêm giao diện cho fragment, bạn phải implement method onCreateView(), nó sẽ được hệ thống gọi khi lần đầu tiên fragment draw layout, method này trả về một View.
Để trả về layout tf onCreateView, bạn có thế inflate một layout resource định nghĩa trong XML, ví dụ:
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);
}
}
Method inflate() cung cấp 3 argument:
– ID resource của layout muốn inflate
– ViewGroup là cha của layout inflate.
– Biến boolean trong trường hợp layout inflate sẽ được gắn vào với VewGroup cha trong khi inflate. Trong trường hợp false bởi vì hệ thống đã chèn layout inflate vào trong ViewGroup.
Add một fragment vào trong một Activity
Có 2 cách có thể add fragment vào trong activity:
1. Khai báo fragment bên trong layout activity
<?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>
2. Lập tình add fragment vào trong một ViewGroup
Trong khi activity đang chạy, có thể add fragment vào activity, đơn giản là xác định một ViewGroup và add fragment.
Sử dụng APIs FragmentTransaction để transaction fragment, có thể get instance của FragmentTransaction từ Activity:
FragmentManager fragmentManager = getFragmentManager()
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction()
;
Thêm fragment sử dụng method add(), chỉ định fragment ví dụ:
ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();
Tham số thứ nhất là ViewGroup, tham số này khai báo trong layout của activity. Tham số thứ hai chính là fragment để add. Cuối cùng gọi method commit() để bắt đầu chuyển đổi.
Trước khi gọi method commit(), bạn có thể gọi method addToBackStack(), cho phép người dùng trở về trạng thái trước của fragment thông qua button Back.
// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();
Giao tiếp với Activity
Fragment có thể giao tiếp với activity thông qua instance với method getActivity(), ví dụ
View listView = getActivity()
.findViewById
(R.id.list);