Friday, May 9, 2014

Fragment

Tổng quan

Fragment có thể hiểu như là những "mảnh" nội dung độc lập được chèn vào bên trong activity. Chúng ta xem qua một số tình huống bên dưới để hiểu cách Fragment sử dụng trong lập trình Android.

Tình huống 1: Trên màn hình ứng dụng chúng ta muốn thể hiện 2 phần nội dụng. Phần 1 hiển thị một danh sách (ListView) các địa chỉ website, phần 2 dùng một WebView để hiển thị nội dung.
...hiển thị nội dung website được chọn ở ListView...
Tình huống 2: Lần này thay vì hiển thị nội dung website chúng ta cần hiển thị nội dung bức ảnh mà người dùng chọn ở danh sách.
...hiển thị nội dung ảnh..
Tình huống 3: Hai ví dụ trên nội dung và danh sách lựa chọn đều nằm trên cùng một màn hình. Nhưng vấn đề là để hiển thị tất cả như vậy thì nội dung cần màn hình hiển thị lớn (tablet), đối với màn hình nhỏ (phone) thì cần phân tách như hình bên dưới.
Hiển thị trên tablet và phone
Các tình huống trên chúng ta gặp vấn đề cần hiển thị 2 nội dung tách biệt hoàn toàn về giao diện lẫn thao tác mà chúng lại cần hoạt động đồng thời trên cùng màn hình activity. Để giải quyết vấn đề này chúng ta sử dụng Fragment như những mảnh ghép, ghép các nội dung khác nhau lại và đặt chúng vào trong cùng một activity. 

Lợi ích

Sử dụng Fragment đem lại những ưu điểm như:

  • Giúp cho việc tái sử dụng các thành phần trên các layout khác nhau trở nên dễ dàng.
  • Hỗ trợ việc hiển thị layout dạng dọc (portrait) hay ngang (landscape) ở trên bất kỳ điện thoại hay máy tính bảng nào.
  • Giúp nhà phát triển kiểm soát việc hiển thị cửa sổ đơn (single-pane) trên điện thoại và hiển thị đa cửa sổ (multi-pane) trên tablet.


Vòng đời

Cũng giống activity, fragment có vòng đời của riêng nó trải qua các bước như onCreate, onStart, onResume, onPause, onStop... tuy nhiên thì nó không phụ thuộc vào vòng đời của activity mà nó đính vào.


Phương thứcMô tả
onAttach()Fragment được đính vào activity. Activity lúc này cũng có thể chưa được khởi tạo đầy đủ.
onCreate()Fragment được tạo.
onCreateView()Fragment được tạo với giao diện đầy đủ. Giao diện view của fragment trở thành một phần trong giao diện view phân cấp của activity.
onActivityCreated()Activity và fragment được khởi tạo đầy đủ. Lúc này, view có thể được truy cập bởi phướng thức findViewById().
onResume()Fragment được kích hoạt và hiển thị lên giao diện người dùng.
onPause()Fragment vẫn tồn tại nhưng không hoạt động, tình huống này được hiểu như là một activity khác đang đè lên activity chứa fragment.
onStop()Fragment bị hủy.

Định nghĩa và sử dụng

Khai báo class kế thừa class Fragment

public class DetailFragment extends Fragment {

 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
   Bundle savedInstanceState) {
  View view = inflater.inflate(R.layout.fragment_rssitem_detail,
    container, false);
  return view;
 }

 public void setText(String item) {
  TextView view = (TextView) getView().findViewById(R.id.detailsText);
  view.setText(item);
 }
}

Sử dụng Fragment kiểu tĩnh (statically)



    


Sử dụng Fragment kiểu động (dynamically)

public class DebugExampleTwo extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initFragment(new DebugExampleTwoFragment());
    }

    protected void initFragment(Fragment fragment) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(android.R.id.content, fragment);
        fragmentTransaction.commit();
    }

}
Source code ví dụ có thể tải tại đây.

No comments:

Post a Comment