Tôi có một ứng dụng Android, nơi tôi có một hoạt động và một chồng các mảnh.NullPointerException liên quan đến FragmentManager.popBackStack. Làm thế nào để giải quyết?
Sử dụng Crashlytics, tôi đã nhận được một trường hợp duy nhất của Exception
sau:
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.FragmentManager.popBackStack(java.lang.String, int)' on a null object reference
at com.company.app.Fragment$7$2.onClick(Fragment.java:397)
at android.view.View.performClick(View.java:5197)
at android.view.View$PerformClick.run(View.java:20926)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5942)
at java.lang.reflect.Method.invoke(Method.java)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
Các mã được sản xuất lỗi này là:
okButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
// The next line produces the Exception
getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// Other code...
}, 250);
}
});
Dựa trên thử nghiệm tôi đã thực hiện với điều này ứng dụng, người dùng mà ngoại lệ này xảy ra và thực tế là chỉ xảy ra một lần, tôi nghĩ rằng điều này Exception
xảy ra khi một số trường hợp hợp nhất kỳ lạ xảy ra. (Về cơ bản, tôi không thể sao chép số này Exception
vào cuối của tôi.) Tôi giả định điều này phải làm với người dùng đang chạy ứng dụng của tôi và sau đó tiếp tục lại sau đó, và sau đó cuộc gọi getFragmentManager()
trả lại null
.
Vì vậy, tôi biết rằng tôi có thể "sửa chữa" này với các mã như sau (thấy điều này như là một sửa chữa áp dụng cho một kho GitHub):
FragmentManager fm = getFragmentManager();
if (fm != null) fm.popBackStack();
Trong khi tôi nhận ra rằng các mã trên sẽ "sửa chữa "vấn đề ở chỗ nó sẽ tránh NPE
, (do đó dừng ứng dụng khỏi bị rơi), nó không thực sự" khắc phục "sự cố bằng cách cho phép ứng dụng của tôi hoạt động như mong muốn. Các Fragment
trong câu hỏi là # 3 trong một đống mảnh vỡ, như thế này:
#1 --> #2 --> #3
các hành vi mong muốn cho ứng dụng này là để đáp ứng với nút bấm điều này bằng cách popping trở lại Fragment
# 1 là nhìn thấy được. Chỉ cần thêm mã ở trên có vẻ như nó sẽ giữ cho ứng dụng không bị lỗi, nhưng không thay đổi giao diện người dùng của ứng dụng theo cách mong muốn.
Tôi đang làm gì sai khi ứng dụng của tôi tiếp tục, đó là "trạng thái phân đoạn" đã hết hiệu lực?
Tôi có cùng một vấn đề chính xác, tôi gọi getFragmentManager(). PopBackStack() trên nút để đóng đoạn và quay lại phần trước. Tôi cũng không thể tái tạo nó nhưng lỗi thường xuyên đủ để trở thành một vấn đề thực sự. –
Tôi đang gặp phải sự cố này ngay bây giờ bạn có tìm thấy giải pháp không ?? –