Fragment là gì?
Fragment trong Android là cơ chế cho phép chúng ta thiết kế các ứng dụng Android theo phương pháp mô-đun – nghĩa là thiết kế giao diện và các tính năng chỉ một lần và sử dụng lại trong các Activity khác nhau.
Một fragment tương tự một Activity cũng gồm một tập tin layout (.xml) và một tập tin lớp (.java). Có thể hiểu một fragment giống một Activity thu nhỏ.
Tạo một fragment
Như đã đề cập ở trên, một fragment gồm hai tập tin: một tập tin XML (.xml) thể hiện layout của fragment, ví dụ layout chứa một RelativeLayout và một TextView như sau:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/red" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="@string/fragone_label_text" android:textAppearance="?android:attr/textAppearanceLarge" /> </RelativeLayout>
Và một tập tin (.java) chứa lớp tương ứng với layout và lớp này là lớp con của lớp Fragment, một ví dụ:
package com.example.myfragmentdemo; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class FragmentOne extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_one_layout, container, false); } }
Lớp FagmentOne kế thừa lớp Fragment và định nghĩa lại phương thức onCreateView (tương tự phương thức onCreate của một Activity). Lúc này chúng ta có thể sử dụng fragment trên các Activities khác nhau.
Thêm một fragment đến một Activity dùng tập tin XML
Đầu tiên, các Activities muốn sử dụng các fragment phải kế thừa lớp FragmentActivity thay vì lớp AppCompatActivity (như mặc định), ví dụ:
package com.example.myfragmentdemo; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.view.Menu; public class FragmentDemoActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fragment_demo); } }
Fragment có thể được nhúng trong một Activity thông qua tập tin layout (XML) của Activity bằng cách dùng phần tử <fragment>, ví dụ:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".FragmentDemoActivity" > <fragment android:id="@+id/fragment_one" android:name="com.example.myfragmentdemo.myfragmentdemo.FragmentOne" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" tools:layout="@layout/fragment_one_layout" /> </RelativeLayout>
Thuộc tính quan trọng nhất của <fragment> là android:name với giá trị là tên fragment cần nhúng.
Thêm một fragment đến một Activity dùng mã Java
Cách dễ nhất để thêm fragment đến một Activity là dùng phần tử XML <fragment> nhưng nhược điểm là không thể thay đổi fragment tại thời điểm thực thi (runtime) của ứng dụng. Để có thể kiểm soát fragment trong quá trình thực thi chúng ta có thể thêm fragment dùng mã Java. Đoạn mã sau minh họa cách thêm một fragment đến một Activity dùng Java:
// tạo một thể hiện của lớp fragment FragmentOne firstFragment = new FragmentOne(); // chuyển các intent đến lớp firstFragment.setArguments(getIntent().getExtras()); // tham chiếu đến đối tượng quản lý fragment FragmentManager fragManager = getSupportFragmentManager(); // gọi phương thức beginTransaction() của đối tượng quản lý fragment // để sẵn sàng thêm fragment đến đối tượng này FragmentTransaction transaction = fragManager.beginTransaction(); // thêm fragment đến đối tượng quản lý fragment transaction.add(R.id.LinearLayout1, firstFragment); // quá trình thêm fragment hoàn tất với phương thức commit() transaction.commit();
Chúng ta cũng có thể xóa một fragment dùng phương thức transaction.remove() hay thay thế một fragment bằng một fragment khác dùng transaction.replace(). (tìm hiểu thêm về fragment tại https://developer.android.com/reference/android/app/Fragment )
Xử lý sự kiện fragment
Một fragment tương tự một Activity tức là nó cũng gồm một layout chứa các views. Khi liên quan đến các views thì vấn đề sự kiện sẽ nảy sinh. Tiếp cận sự kiện và xử lý sự kiện của các views trong một fragment hoàn toàn tương tự các views trong layout của một Activity. Xem lại sự kiện và xử lý sự kiện trong Android.
Giao tiếp fragments
Khi các fragments được nhúng vào một Activity thì quá trình giao tiếp sẽ diễn ra giữa các fragments với nhau hay giữa các fragments với Activity. Giữa các fragments không thể diễn ra quá trình giao tiếp trực tiếp mà phải thông qua một Activity trung gian. Một Activity muốn giao tiếp với một fragment thì cần thông qua ID của fragment này; ngược lại, một fragment muốn giao tiếp với Activity thì vần đề trở nên phức tạp hơn. Lúc này phải dùng một giao diện trung gian. Quá trình giao tiếp của fragment sẽ được hiểu rõ hơn quan phần tạo ứng dụng minh họa sau đây.
Một ứng dụng Android dùng fragment
Bây giờ chúng ta sẽ tạo một ứng dụng Android chứa một Activity và hai fragments. Fragment thứ nhất sẽ gồm một RelativeLayout chứa một EditText và một Button; fragment thứ hai chỉ chứa một TextView trong một RelativeLayout. Hai fragments được nhúng trong một Activity và khi chúng ta nhập thông tin vào EditText và nhấn Button trong fragment thứ nhất thì nội dung trong EditText sẽ hiển thị trong TextView của fragment thứ hai. Quá trình tạo ứng dụng gồm các bước sau:
- Tạo dự án FragmentExample
- Tạo fragment thứ nhất
- Tạo fragment thứ hai
- Nhúng các fragment đến Activity
- Giao tiếp giữa fragments và Activity
- Chạy thử ứng dụng
Kết luận
Trong bài này chúng ta đã tìm hiểu về fragment – một cơ chế cho phép thực thi theo phương pháp mô-đun trong Android. Có thể tìm hiểu thêm về fragment tại https://developer.android.com/training/basics/fragments/creating
Các tập tin của ứng dụng FragmentExample có thể xem tại GitHub.
Ý kiến bài viết