2011-08-19 42 views
37

Tôi có một Activity. Số Activity có hai số Fragment s. Phân đoạn A là Menu. Fragment B là chi tiết.Làm thế nào để tiêu diệt Fragment?

Tôi cố gắng Thực hiện phân đoạn C khác trong đoạn B, vì vậy, có 3 đoạn trong Activity. Và tôi cố gắng Thay thế đoạn B thành đoạn D.

Tôi đoán Đoạn B và C đã chết. NHƯNG những mảnh vỡ này còn sống. Chỉ những Mảnh vụn là trạng thái onDestroyView(). Tôi muốn onDestroy() hoặc onDetach().

Tôi phải làm gì cho Fragments.onDestroy() hoặc onDetach()? Tôi không thể phá hủy hoặc thay đổi số Activity.

+0

Bạn đang thay thế bằng cách thêm vào stack trở lại? Nếu vậy thì tôi không mong đợi mảnh vỡ bị phá hủy. Nếu sau đó bạn không thêm giao dịch vào ngăn xếp lại trên một thay thế. – PJL

Trả lời

54

Nếu bạn không xóa các đoạn này theo cách thủ công, chúng vẫn được đính kèm với hoạt động. Hoạt động của bạn không bị phá hủy để những mảnh vỡ này cũng vậy. Để loại bỏ (do đó phá hủy) những mảnh vỡ, bạn có thể gọi:

fragmentTransaction.remove(yourfragment).commit() 

Hy vọng nó sẽ giúp bạn

+0

Điều này đã giúp tôi với sự cố "id trùng lặp" đáng sợ. Cảm ơn! – xorgate

+0

khi một mảnh được lấy ra, phương pháp vòng đời nào được gọi? Tương tự như vậy, khi một mảnh được thay thế thì phương pháp của vòng đời mảnh vỡ được gọi là gì? –

+4

Wow, điều này làm cho tài liệu của Google thay thế() hoàn toàn sai: '' Về cơ bản giống như gọi remove (Fragment) cho tất cả các mảnh hiện đang được thêm vào cùng một containerViewId và sau đó thêm (int, Fragment, String) với các đối số tương tự được đưa ra ở đây.'' Khi trong thực tế, chỉ gọi remove() phá hủy mảnh và thay thế không. – 0101100101

9

tặng một cố gắng để này

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
    // TODO Auto-generated method stub 

    FragmentManager manager = ((Fragment) object).getFragmentManager(); 
    FragmentTransaction trans = manager.beginTransaction(); 
    trans.remove((Fragment) object); 
    trans.commit(); 

    super.destroyItem(container, position, object); 
} 
2

Nếu bạn đang ở trong đoạn chính nó, bạn cần gọi nó. yourFragment cần phải là phân đoạn đang được gọi. Nhập mã:

getFragmentManager(). startsTransaction(). remove (yourFragment) .commitAllowingStateLoss();

hoặc nếu bạn đang sử dụng supportLib, sau đó bạn cần phải gọi:..

getSupportFragmentManager() beginTransaction() loại bỏ (yourFragment) .commitAllowingStateLoss();

-1

Nó được sử dụng trong Kotlin

appCompatActivity?.getSupportFragmentManager()?.popBackStack() 
Các vấn đề liên quan