2011-11-24 50 views
7

Đây là trường hợp gây ra sự cố:Lỗi backstack mảnh vỡ khi thay thế các mảnh trong giao dịch?

  1. Tôi bắt đầu một Acitivity với nhóm ViewGroup sẽ giữ các mảnh được trình bày.
  2. Tôi tải Fragment A vào ViewGroup này bằng cách gọi .replace() trong giao dịch mà tôi lưu vào backstack.
  3. Tôi tải Phân đoạn B vào Nhóm xem, thay thế Đoạn A. Một lần nữa, tôi lưu giao dịch.
  4. Tôi xoay thiết bị hai lần.
  5. Trên vòng xoay thứ hai, Đoạn A (không hiển thị tại thời điểm này) sẽ ném ngoại lệ NullPointer.

Trường hợp ngoại lệ này được phân đoạn bởi Đoạn A, vì tôi đang lưu một số giá trị Chế độ xem (EditTexts ví dụ) trong phương thức onSaveInstanceState() của nó. Dường như, vào vòng xoay thứ hai, hệ thống không khởi tạo các Chế độ xem này, vì vậy khi tôi hỏi giá trị của chúng, tôi nhận được ngoại lệ NullPointer. Điều này có thể tránh được bằng cách nào đó không? Hoặc đang sử dụng các thao tác .replace trong một quá trình chuyển đổi đoạn được lưu vào backstack không được đề cập?

Trả lời

3

Tôi đã có này, nhưng không thể hoàn toàn nhớ lại những chi tiết cụ thể về những gì tôi đã làm để sửa chữa nhưng nói chung (và xin lỗi cho bãi não) Tôi làm như sau:

  1. Gọi setRetainInstance(true) trong onCreate để tránh việc giải trí phân mảnh

  2. Lưu trạng thái điều khiển chỉnh sửa v.v. trong onSaveInstanceState để sử dụng nếu hoạt động bị hủy và bạn được khôi phục với gói không rỗng (bạn sẽ không nhận được gói không rỗng theo hướng thay đổi với 1.)

  3. Duy trì giá trị kiểm soát chỉnh sửa trong các biến thành viên (tùy theo từng đoạn sẽ không được tái tạo) đảm bảo họ được cập nhật trong một onDestroyView từ chỉnh sửa điều khiển và sau đó sử dụng chúng để khôi phục các giá trị chỉnh sửa kiểm soát trong onCreateView

  4. Có một lá cờ mà tôi đặt thành true trong onCreateView và sai trong onDestroyView và đảm bảo rằng tôi không chạm vào các điều khiển giao diện người dùng khi chế độ xem không ở xung quanh.

BTW Sử dụng replace trong khi thêm giao dịch vào ngăn xếp lại hoàn toàn OK.

Hy vọng có điều gì đó giúp ích. Peter.

+3

Tôi nhận thấy bạn đã chấp nhận câu trả lời này ... điều gì đã trở nên hữu ích? –

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