- vừa được xem lúc

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

0 0 22

Người đăng: Vi Ngọc Đông

Theo Viblo Asia

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.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Học Flutter từ cơ bản đến nâng cao. Phần 1: Làm quen cô nàng Flutter

Lời mở đầu. Gần đây, Flutter nổi lên và được Google PR như một xu thế của lập trình di động vậy.

0 0 254

- vừa được xem lúc

Học Flutter từ cơ bản đến nâng cao. Phần 3: Lột trần cô nàng Flutter, BuildContext là gì?

Lời mở đầu. Màn làm quen cô nàng FLutter ở Phần 1 đã gieo rắc vào đầu chúng ta quá nhiều điều bí ẩn về nàng Flutter.

0 0 189

- vừa được xem lúc

[Android] Hiển thị Activity trên màn hình khóa - Show Activity over lock screen

Xin chào các bạn, Hôm nay là 30 tết rồi, ngồi ngắm trời chờ đón giao thừa, trong lúc rảnh rỗi mình quyết định ngồi viết bài sau 1 thời gian vắng bóng. .

0 0 93

- vừa được xem lúc

Tìm hiểu Proguard trong Android

1. Proguard là gì . Cụ thể nó giúp ứng dụng của chúng ta:. .

0 0 82

- vừa được xem lúc

Làm ứng dụng học toán đơn giản với React Native - Phần 6

Chào các bạn một năm mới an khang thịnh vượng, dồi dào sức khỏe. Lại là mình đây Đây là link app mà các bạn đang theo dõi :3 https://play.google.com/store/apps/details?id=com.

0 0 51

- vừa được xem lúc

20 Plugin hữu ích cho Android Studio

1. CodeGlance. Plugin này sẽ nhúng một minimap vào editor cùng với thanh cuộn cũng khá là lớn. Nó sẽ giúp chúng ta xem trước bộ khung của code và cho phép điều hướng đến đoạn code mà ta mong muốn một cách nhanh chóng.

0 0 301