Tôi có một Hoạt động Phân đoạn gốc có một ViewPager có chứa một ViewPager con. ViewPager con chứa Fragments cho mỗi trang. Tôi liên lạc giữa các đoạn trang con này và Hoạt động phân đoạn gốc hàng đầu bằng cách sử dụng giao diện gọi lại, ví dụ:'IllegalStateException: Hoạt động đã bị hủy' khi 'getSupportFragmentManager()' được gọi sau khi Hoạt động khởi động lại
public interface Callbacks {
public void onItemSelected(Link link);
}
Trong bố mẹ Hoạt động phân đoạn tôi lắng nghe sự kiện onItemSelected
ví dụ:
@Override
public void onItemSelected(Link link) {
Bundle argumentsFront = new Bundle();
argumentsFront.putParcelable(FragmentComments.ARG_ITEM_ID, link);
fragmentComments = new FragmentComments();
fragmentComments.setArguments(argumentsFront);
getSupportFragmentManager().beginTransaction().replace(R.id.post_container, fragmentComments).commitAllowingStateLoss();
}
Điều này hoạt động tốt khi ứng dụng được khởi chạy lần đầu tiên.
Nếu bạn xoay thiết bị để thay đổi hướng, hoạt động sẽ khởi động lại. Tất cả các mảnh vỡ tự khởi động lại khi tôi sử dụng setRetainInstance(true);
(Tôi không gọi setRetainInstance (true) trong các mảnh vỡ trang của ViewPager con vì nó không được hỗ trợ). Tuy nhiên, nếu tôi nhấp vào một mục danh sách trong Phân đoạn của ViewPager con tôi nhận ngoại lệ này:
FATAL EXCEPTION: main
java.lang.IllegalStateException: Activity has been destroyed
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1342)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
at android.support.v4.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:578)
Có ai biết tại sao điều này xảy ra không?
Cảm ơn
Thật không may điều này không hoạt động. Phương thức 'onAttach' của tôi trông giống như phương thức bạn đã cung cấp. Về định hướng thay đổi phương thức 'onAttach' của tôi không được gọi lại và kết quả là cuộc gọi lại của tôi không được cập nhật. Phân đoạn gốc có 'setRetainInstance (đúng)', tôi đoán điều này ngăn chặn phân đoạn con này bị tách ra? – Milo
Hmm theo tài liệu 'onAttach' vẫn nên được gọi ngay cả khi' setRetainInstance (true) 'được thiết lập, vì vậy có thể có lỗi khác ở đây. Bạn có thể đăng thêm mã của mình xung quanh cài đặt và gọi lại cuộc gọi lại không? Ngoài ra, hãy kiểm tra câu trả lời cho câu hỏi này, bằng cách sử dụng 'setRetainInstance (true)' không phải là một thực hành tốt trong tình huống này, bạn nên lưu và khôi phục trạng thái - http://stackoverflow.com/questions/11182180/understanding-fragments- setretaininstanceboolean –
Tôi tìm thấy một giải pháp. Bởi vì tôi đã lồng các mảnh vỡ như thế này: (FragmentActivity -> Fragment 1 -> Fragment 2 (với ViewPager) -> ViewPager Child Fragments) Tôi phải di chuyển callbacks đến Fragment 1 (trong đó onAttach và onDetach được gọi) . Sau đó, tôi đã thực hiện một cuộc gọi tĩnh từ phương thức 'onItemSelected' trong các phần tử con của ViewPager để gọi lại trong phần cha Fragment (Fragment 1). Điều này có vẻ hơi hack nhưng hoạt động tốt. Tôi sử dụng 'setRetainInstance (true)' trong Fragment 1 để các Fragment con giữ trạng thái. – Milo