2012-02-06 22 views
99

Trong tài liệu Android cho số 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 từng cái và từ những gì tôi có thể nói chúng dường như giống nhau.Sự khác nhau giữa việc tách một Mảnh và loại bỏ nó là gì?

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

Trả lời

135

Phương pháp tách sẽ xóa 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 đoạn. Điều này có nghĩa là bạn có thể tái sử dụng phân đoạn này bằng cách gọi phương thức đính kèm, với một ViewHierarchy

Xóa có nghĩa là không thể đính kèm lại phân đoạn mảnh. Bạn sẽ phải thêm lại nó vào giao dịch phân đoạn.

Nguồn Comment

Bạn sẽ nhận thấy rằng khi một Fragment được tách ra, onPause, onStop và onDestroyView của phương pháp này được gọi là chỉ (theo thứ tự đó). Mặt khác, khi một Fragment được 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 gắn, 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

+134

Để thêm vào câu trả lời của Rajdeep, bạn sẽ nhận thấy rằng khi 'Phân đoạn' là _detached_, các phương thức' onPause', 'onStop' và' onDestroyView' chỉ được gọi (theo thứ tự đó). Mặt khác, khi 'Fragment' là _removed_, các phương thức' onPause', 'onStop',' onDestroyView', 'onDestroy' và' onDetach' được gọi (theo thứ tự đó). Tương tự, khi _attaching_, các phương thức 'onCreateView',' onStart' và 'onResume' của' Fragment' chỉ được gọi; và khi _adding_, các phương thức 'onAttach',' onCreate', 'onCreateView',' onStart' và 'onResume' của' Fragment' được gọi (theo thứ tự đó). –

+0

Có một phần hỏi đáp nhanh với Diane Hackborn [ở đây] (https://groups.google.com/forum/#!topic/android-platform/QlkLMsncDwg). Vậy tại sao tôi có nhật ký [this] (http://stackoverflow.com/questions/18238214/stop-oncreateoptionsmenu-to-be-called-from-detached-fragment)? Làm thế nào để bạn biết rằng FT.detach() đã được gọi? – Poutrathor

+0

Whats lợi ích của cái này qua cái kia? Tôi muốn biết một trường hợp sử dụng khi một trong những thuận lợi hơn khác? Tôi luôn thêm và xóa, có tệ không? –

44

Việc đặt tên của các phương pháp quản lý phân đoạn rất khó hiểu ngay cả theo các kỹ sư của Google trên bảng tin (xem 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ự hiệu quả. Đây là những phát hiện của tôi. Vui lòng sửa tôi nếu tôi sai.

Để bước đầu thêm Phân đoạn vào hoạt động, bạn sử dụng: getFragmentManager(). StartsTransaction(). Thêm (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à kết quả các sự kiện chu kỳ sống và giá trị trả về phương pháp 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 từ một hoạt động, bạn sử dụng:. getFragmentManager() beginTransaction() loại bỏ (mFragment).. commit().

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

Dưới đây là kết quả các sự kiện chu kỳ sống và giá trị trả về phương pháp quan trọng khác:

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

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

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

Để tách một Fragment thêm từ một hoạt động, bạn sử dụng: getFragmentManager() .beginTransaction(). detach (mFragment) .commit().

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

Dưới đây là kết quả các sự kiện chu kỳ sống và các giá trị khác phương pháp quan trọng trở lại:

onPause()        
onStop()        
onDestroyView()      

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

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

Điều này tạo Chế độ xem mới để liên kết với Phân đoạn và duy trì liên kết Hoạt động.

Dưới đây là kết quả các sự kiện chu kỳ sống và giá trị trả về phương pháp quan trọng khác:

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

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

đ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 một lần nữa sử dụng thêm() chứ không phải là đính kèm(), dường như không có gì thay đổi.

nếu bạn cố gắng thêm Phân đoạn đã bị xóa bằng cách sử dụ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, Phân đoạn có thể vẫn có tham chiếu nội bộ cho Chế độ xem cuối cùng được tạo. Chế độ xem này không còn giá trị và không được sử dụng.

+0

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

+1

Vì vậy, nó bật ra rằng "đính kèm()" sẽ không gọi onAttach(). "detach()" sẽ không gọi onDetach(). –

Các vấn đề liên quan