Sự khác biệt giữa tách rời một Fragment và loại bỏ nó là gì?


118

Trong tài liệu Android dành cho FragmentTransaction, tôi nhận thấy hai phương pháp rất giống nhau: detachremove. Các mô tả ở đó dường như không cung cấp nhiều thông tin chi tiết về thời điểm sử dụng mỗi loại và từ những gì tôi có thể cho biết chúng dường như giống nhau.

Vậy: sự khác biệt giữa hai phương pháp này là gì?

Câu trả lời:


156

Phương thức tách rời sẽ loại bỏ phân đoạn khỏi giao diện người dùng, nhưng trạng thái của nó được duy trì bởi Trình quản lý phân mảnh. Điều này có nghĩa là bạn có thể sử dụng lại phân đoạn này bằng cách gọi phương thức đính kèm, với Chế độ xem đã sửa đổi

Loại bỏ có nghĩa là không thể gắn lại cá thể phân mảnh. Bạn sẽ phải thêm nó một lần nữa vào giao dịch phân mảnh.

Nguồn bình luận

Bạn sẽ nhận thấy rằng khi một Fragment được tách ra, các phương thức onPause, onStop và onDestroyView của nó chỉ được gọi (theo thứ tự đó). Mặt khác, khi một Fragment bị loại bỏ, các phương thức onPause, onStop, onDestroyView, onDestroy và onDetach của nó được gọi (theo thứ tự đó). Tương tự, khi đính kèm, các phương thức onCreateView, onStart và onResume của Fragment chỉ được gọi; và khi thêm, các phương thức onAttach, onCreate, onCreateView, onStart và onResume của Fragment được gọi (theo thứ tự đó). - Adil Hussain


145
Để thêm vào câu trả lời của Rajdeep, bạn sẽ nhận thấy rằng khi a Fragmentđược tách raonPause , onStoponDestroyViewcác phương thức của nó chỉ được gọi (theo thứ tự đó). Mặt khác, khi một Fragmentđược loại bỏ , nó onPause, onStop, onDestroyView, onDestroyonDetachphương pháp này được gọi là (theo thứ tự đó). Tương tự như vậy, khi gắn , các Fragment's onCreateView, onStartonResumephương pháp chỉ được gọi là; và khi thêm , các Fragment's onAttach, onCreate, onCreateView, onStartonResumephương pháp này được gọi là (theo thứ tự đó).
Adil Hussain

1
Có một câu hỏi và trả lời nhanh với Diane Hackborn ở đây . Vậy tại sao tôi lại có nhật ký này ? Làm thế nào để bạn biết rằng FT.detach () đã được gọi?
Poutrathor

1
Lợi ích của cái này hơn cái kia là gì? Tôi muốn biết một trường hợp sử dụng khi cái này thuận lợi hơn cái kia? Tôi luôn thêm và bớt, điều đó có tệ không?
Neon Warge

1
Làm rõ ngắn gọn và súc tích tốt nhất.
Robotec

55

Cách đặt tên của các phương pháp quản lý phân mảnh rất khó hiểu ngay cả theo các kỹ sư của Google trên bảng tin (xem các bình luận ở trên). Tôi đã tự làm một bản demo nhỏ để tìm ra cách mọi thứ thực sự hoạt động. Đây là những phát hiện của tôi. Hãy sửa cho tôi nếu tôi sai.

Để thêm một Fragment vào Activity lúc đầu, bạn sử dụng: getFragmentManager (). BeginTransaction (). Add (R.id.container, mFragment) .commit ().

Điều này liên kết Hoạt động với Phân đoạn và cũng liên kết Chế độ xem với Phân đoạn.

Dưới đây là các sự kiện kết quả trong vòng đời và các giá trị trả về phương thức quan trọng khác:

onAttach()           
onCreate()           
onCreateView()       
onViewCreated()      
onActivityCreated()  
onViewStateRestored()
onStart()            
onResume()

mFragment.getView() == null: false                    
mFragment.getActivity() == null: false

Để loại bỏ một Fragment khỏi Activity, bạn sử dụng: getFragmentManager (). BeginTransaction (). Remove (mFragment) .commit ().

Thao tác này sẽ xóa mọi liên kết với Chế độ xem hoặc với Hoạt động.

Dưới đây là các sự kiện kết quả trong vòng đời và các giá trị trả về phương thức quan trọng khác:

onPause()
onStop()
onDestroyView()
onDestroy()
onDetach()

mFragment.getView() == null: true
mFragment.getActivity() == null: true

Tôi đã thêm lại đoạn ở đây

Để tách một Fragment đã thêm khỏi một Activity, bạn sử dụng: getFragmentManager (). BeginTransaction (). Detach (mFragment) .commit ().

Thao tác này sẽ xóa mọi liên kết với Chế độ xem, nhưng vẫn giữ liên kết với Hoạt động.

Dưới đây là các sự kiện kết quả trong vòng đời và các giá trị trả về phương thức quan trọng khác:

onPause()                             
onStop()                              
onDestroyView()                      

mFragment.getView() == null: true
mFragment.getActivity() == null: false

Để đính kèm lại một Fragment đã được tách ra khỏi Activity, bạn sử dụng: getFragmentManager (). BeginTransaction (). Attachment (mFragment) .commit ().

Điều này tạo ra một View mới để liên kết với Fragment và duy trì liên kết Activity.

Dưới đây là các sự kiện kết quả trong vòng đời và các giá trị trả về phương thức quan trọng khác:

onCreateView()                        
onViewCreated()                       
onActivityCreated()                   
onViewStateRestored()                 
onStart()                             
onResume()                            

mFragment.getView() == null: false
mFragment.getActivity() == null: false

Những điều quan trọng khác cần lưu ý: Nếu bạn tách một Fragment và sau đó cố gắng thêm lại nó bằng add () thay vì đính kèm (), dường như không có gì thay đổi.

nếu bạn cố gắng thêm một Fragment đã bị xóa bằng remove () bằng cách sử dụng Attach () thay vì add (), dường như không có gì thay đổi.

Khi getView () trả về null, Fragment vẫn có thể có các tham chiếu nội bộ đến View cuối cùng mà nó đã tạo. Chế độ xem này không còn hợp lệ và không nên được sử dụng.


1
Làm tốt lắm. Nhưng có vẻ khá thú vị khi thử gắn lại và thêm lại cũng có tác dụng tương tự sau khi mảnh được loại bỏ.
stdout

9
Vì vậy, hóa ra "đính kèm ()" sẽ không gọi onAttach (). "detach ()" sẽ không gọi onDetach ().
KunYu Tsai

1
Và một số sự kiện trong vòng đời này có thể thay đổi một chút nếu bạn giữ các giao dịch trong ngăn xếp phía sau.
stdout
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.