17

Ứng dụng của tôi bao gồm 4 đoạn như các tab được tải bên trong Phân đoạn gốc bằng cách sử dụng FragmentPagerAdapter.Cố gắng gọi phương thức ảo 'android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()' trên tham chiếu đối tượng null

Vấn đề là khi tôi chạy ứng dụng và nhấn trở lại và mở lại ứng dụng Tôi nhận log lỗi này:

FATAL EXCEPTION: main 
java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()' on a null object reference 
    at android.support.v4.app.FragmentManagerImpl.ensureExecReady(FragmentManager.java:1949) 
    at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1965) 
    at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:620) 
    at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143) 
    at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:513) 
    ... 

dòng mã bên Fragment mẹ là:

viewPager.setAdapter(adapter); 
tabLayout.setupWithViewPager(viewPager); 

ViewPageAdapter cả hai đều không phải là rỗng !!

tôi phải đề cập đến rằng tất cả Fragment s tôi vòng đời đang được quản lý và vấn đề vô đang xảy ra bên trong bộ chuyển đổi !, và Adaptor cùng đang làm việc tốt khi tôi sử dụng một Activity như cha mẹ thay vì Fragment !!!

Trả lời

30

Sau rất nhiều nghiên cứu, nó có vẻ như nó là một vấn đề thư viện hỗ trợ:

Activity with fragment and ViewPager crashesh on configuration change
Android Support Library issue 24.1.0

Tôi cũng tìm thấy câu trả lời này, nhưng có vẻ không bình thường thêm một lá cờ để tôi mã:

Attempt to invoke virtual method ‘android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()’ on a null object

Tôi ghi đè phương thức finishUpdate của số FragmentPagerAdapter như thế này và sự cố được giải quyết ngay bây giờ!

@Override 
public void finishUpdate(ViewGroup container) { 
    try{ 
     super.finishUpdate(container); 
    } catch (NullPointerException nullPointerException){ 
     System.out.println("Catch the NullPointerException in FragmentPagerAdapter.finishUpdate"); 
    } 
} 

câu trả lời nào tốt hơn? vui lòng cho tôi biết ...

+1

Tôi đang phải đối mặt với cùng một vấn đề, tôi sẽ cố gắng sửa chữa này cho đến khi một sửa chữa chính thức là phát hành, –

+0

Vui mừng vì nó giúp :) –

+1

Làm việc cho tôi ... Cảm ơn. – Manoj

2

Tôi đã gặp vấn đề tương tự và nguyên nhân là do việc sử dụng lại ViewPager trường hợp bằng các trường hợp khác nhau của một đoạn. Một giải pháp là vô hiệu hóa bộ điều hợp theo phương pháp onDestroyView() của đoạn.

@Override public void onDestroyView() { 
    mViewPager.setAdapter(null); 
    super.onDestroyView(); 
} 

Dự án giới thiệu sự cố và giải pháp can be found here.

3

Tôi gặp vấn đề tương tự. Trong trường hợp của tôi, vấn đề là tôi đã sử dụng lại mà không nhận thấy bộ điều hợp từ lần mở trước đó.

Tôi nhìn vào lớp FragmentManager.java mà gửi ngoại lệ và trên dòng rất giống như bị treo nói: "Phải được gọi là từ chủ đề chính của chủ mảnh"

mã của tôi là:

PagerAdapter adapter = MPageAdapter.getInstance(getSupportFragmentManager()); 
viewPager.setAdapter(adapter); 

vì tôi đang sử dụng PageAdapter làm cầu nối để giao tiếp giữa các đoạn tôi sử dụng mẫu đơn. Điều đó làm việc tốt cho tôi nhưng một khi tôi lặp lại cấu trúc này trong một hoạt động khác, tôi đã có ngoại lệ tương tự. Và lý do là tôi đã quên phá hủy singleton của class adapter của tôi vào cuối mỗi lần sử dụng.

@Override 
protected void onDestroy() { 
    MPageAdapter.Destroy(); //I forgot this one, that makes singleton = null; 
    super.onDestroy(); 
} 
2

Tôi biết nó có thể là muộn, nhưng đây là sai lầm ngu ngốc của tôi, tôi đã không nhìn thấy ngay lập tức:

@Override 
public void onStop() { 
    super.onDestroy(); //I was calling the wrong super 
} 
Các vấn đề liên quan

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