FragmentManager: Tìm hiểu về sự khác biệt giữa add() và replace().

1. FragmentManager là gì? Trước mắt ta cần biết, Fragment là một thành phần android, được sử dụng bởi một Activity, coi như là sub-Activity. Fragment cũng có vòng đời và giao diện riêng. Thường thì mỗi một fragment sẽ có 1 file code đi kèm với một file giao diện XML, trường hợp fragment

1. FragmentManager là gì?

  • Trước mắt ta cần biết, Fragment là một thành phần android, được sử dụng bởi một Activity, coi như là sub-Activity. Fragment cũng có vòng đời và giao diện riêng. Thường thì mỗi một fragment sẽ có 1 file code đi kèm với một file giao diện XML, trường hợp fragment không có file giao diện XML thì được gọi là headless fragments.

    + Vòng đời của Fragment
    image.png
  • Tuy có một vòng đời riêng, nhưng vòng đời của fragment vẫn chịu ảnh hưởng trực tiếp bởi vòng đời Activity chứa nó. Ví dụ kiểu: Activity A chứa Fragment X, khi ta tắt A thì X cũng bị tắt theo, …
  • Vậy FragmentManager được hiểu như là một công cụ giúp người dùng quản lý các Fragment trong một Activity, trong đó có 2 động tác mà chúng ta sẽ hay làm là add() (thêm) và replace() (thay thế). Bài viết hôm nay sẽ đi làm rõ 2 động tác đó.

2. FragmentManager: sự khác biệt giữa add() và replace() qua thực nghiệm nhỏ

  • Các bước đầu cần thực hiện:

    + Khai báo một biến FragmentManager:
    image.png
    + Xây dựng một phương thức bật fragment ngay và sử dụng add():
    image.png
    + Xây dựng một phương thức bật fragment ngay và sử dụng replace():
    image.png
    + Dựng 4 fragment khác nhau và chuẩn bị sẵn kịch bản để bật chúng, ở đây tôi xây dựng 4 fragment tương ứng được bật bới 4 button như hình:
    image.png
    image.png
    Các bạn có thể thấy, 2 fragment đầu tôi đang dùng replace(), 2 fragment sau thì dùng add().
  • Giờ hãy cùng chạy thử và xem kết quả:

    + Màn hình đầu tiên được bật lên là Home:
    image.png
    + Giờ chúng ta click vào button Game để chuyển qua fragmentGame:
    image.png
    + Thậm chí chúng ta có thể thử tương tác để bật đi bật lại 2 fragment này, kết quả nhận được là 2 fragment thay nhau hiển thị, ok, everything is fine!!! Nhưng giờ chúng ta hãy thử bật sang fragmentNews hoặc fragmentPerson bằng cách click vào 1 trong 2 button còn lại trên BottomMenu, chuyện kì lạ sẽ xảy ra trên màn hình của bạn:
    image.png
    + Chúng ta thấy rằng, fragmentNews mà tôi vừa bật đang hiển thị đè lên fragmentGame trước đó, chúng ta vẫn thấy fragmentGame hiển thị đằng sau fragmentNews nhưng lại không thể tương tác được, vậy fragmentGame đang ở trong trạng thái nào? Để kiếm chứng điều này, chúng ta cùng viết thêm vài dòng code trong các phương thức như hình dưới đây trong file code của fragmentGame:
    image.png
    + Kết quả là không hiện gì cả chứng tỏ nó vẫn đang trong trạng thái hoạt động bình thường. Giờ, tại màn hình đang bị chồng chéo nhau bởi fragmentGame và fragmentNews, chúng ta bật nốt fragment cuối cùng là fragmentPerson. Và Kết quả:
    image.png
    + 3 màn hình của 3 fragment đang cùng hiển thị trển một màn hình và đặc biệt hơn là bạn có thể điều khiển cả 2 màn hình fragmentNews và fragmentPerson cùng lúc, ok, everything isn’t fine :v !!! Lúc này chúng ta thực hiện tiếp tục bật 1 trong 2 fragmentNews và fragmentPerson, và:
    image.png
    + Khi vào lại Android Studio chúng ta nhận thấy hệ thống báo lỗi: fragment already added … Điều này cho thấy chúng ta đang add vào backstack nhiều phiên bản gốc của fragment đó.
    image.png
    + Bật lại app và thực hiện lại các thao tác như trên nhưng đến lúc cả 3 màn hình cùng hiển thị, ta thay đổi lựa chọn bật lúc này là 1 trong 2 fragment là fragmentHome hoặc fragmentGame, thì kết quả ta thu được:
    image.png
    + Mọi thứ đều đã trở lại bình thường, lúc này màn hình chỉ hiển thị mỗi fragmentHome như chúng ta đang thấy. Tuy nhiên màn hình fragmentHome này mới toanh, mọi hoạt động của chúng ta trên màn hình này đều không còn.
  • Từ các kết quả thực nghiệm bên trên, ta có thể đưa ra được một vài kết luận nhỏ đối với add() và replace():
    • Trước hết, add() hay replace() đều được gọi là transaction; add() hay replace() đều trả về 1 FragmentTransaction, thứ được đưa vào Backstack hiện tại là FragmentTransaction nếu ta dùng addToBackStack().

      1. add()
    • Các fragment khi dùng add() chúng sẽ được add vào ContainerView (nơi mà các bạn ném fragment vào hiển thị) và chúng được hiển thị chồng chéo lên nhau cùng lúc.
    • Các fragment trước đó và fragment dùng add() đều ở trạng thái hoạt động.
    • Các fragment dùng add() đều có thể tương tác được nếu chúng ta cho chúng hiển thị cùng lúc. Tuy nhiên chỉ tương tác được với những phiên bản mới nhất của các fragment đang hiển thị trên màn hình mà thôi.
    • Và quan trọng khi dùng add() hoạt động hiện thời của chúng ta trên các fragment cũ không bị mất.

2. replace()
+ Sau khi fragment dùng replace() được bật, nó sẽ xóa toàn bộ các fragment mà trước đã add vào ContainerView, sau đó tự thêm chính nó và hiển thị chỉ mình nó lên màn hình.
+ Các fragment sau khi bị xóa khỏi ContainerView sẽ rơi vào trạng thái onDestroyView. Nếu chúng ta thêm addToBackStack(), thì chúng ta sẽ thấy được, khi back lại fragment trước đó, nó sẽ quay trở lại từ onCreateView() đến onResume theo đúng vòng đời của Fragment. Điều đó đồng nghĩa, các thao tác mà ta đã thực hiện trên fragment cũ này sẽ biến mất.

3. Kết

  • Hi vọng bài viết có thể giúp các bạn thông não thêm phần nào về add() và replace() trong FragmentManager. Cảm ơn đã đọc bài viết.

Nguồn: viblo.asia

Bài viết liên quan

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ