FragmentManager: Tìm hiểu về sự khác biệt giữa add() và replace(). Tìm hiểu sâu add(), 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, nếu chúng ta để ý, sẽ thấy màn hình xuất hiện thông báo Toast mà khi trước chúng ta đã set bên file code của fragmentGame từ Pause sang Stop, cùng với đó là mọi hoạt động mà trước kia chúng ta thao tác với tất cả màn hình đều bị reset hết về từ đầu.
  • 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():

    1. add()

    • Các fragment trước đó và fragment dùng add() đều được đưa vào 1 backstack do Activity chứa các fragment đó quản lý.
    • 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ộ fragment hiện tại có trong backstack, sau đó tự thêm chính nó và hiển thị chỉ mình nó lên màn hình.
    • Các màn fragment trước đó đều được đưa về trạng thái stop và bay màu khỏi backstack.
    • Mọi hoạt động hiện thời của chúng ta trên các fragment cũ sẽ bị 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 đầ