17

上調用虛擬方法'android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()'我的應用程序由4個片段組成,這些片段是使用FragmentPagerAdapter在父片段內加載的標籤。嘗試在空對象引用

問題是,當我運行應用程序,並按下返回並重新打開我收到此錯誤日誌中的應用:

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) 
    ... 

的代碼父片段內線路:

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

ViewPageAdapter都不爲零!

我不得不提到我的所有Fragment小號生命週期的管理和空問題的適配器內部發生!當我使用Activity作爲父母,而不是Fragment同一適配器工作正常!

回答

30

了大量的研究後,它看起來是一個支持庫問​​題:

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

我也發現了這個答案,但它看起來不尋常的把一個標誌添加到我的代碼:

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

我重寫了我的FragmentPagerAdapter這樣的finishUpdate方法,現在問題就解決了!

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

有什麼更好的答案?請讓我知道...

+1

我面臨同樣的問題,我會嘗試這個修復,直到正式的修復發佈, –

+0

很高興它幫助:) –

+1

爲我工作......謝謝。 – Manoj

2

我有同樣的問題,這是由片段的不同實例重用ViewPager實例引起的。解決方案是在onDestroyView()片段的方法中將適配器歸零。

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

項目演示問題和解決方案can be found here

3

我有同樣的問題。在我的情況下,問題是我重新使用時沒有注意到上次打開的適配器。

我看着FragmentManager.java類,發送異常和上崩潰非常相同的行說:

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

我的代碼是「必須從片段主機的主線程被稱爲」

因爲我使用我的PageAdapter作爲一個橋樑來通信我使用單例模式的片段。這對我來說效果不錯,但是一旦我在另一個活動中重複了這個結構,我就得到了同樣的例外。原因是我在每次使用結束時忘記銷燬適配器類的單例。

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

我知道這可能是晚了,但這裏是我的愚蠢的錯誤,我沒有看到立竿見影:

@Override 
public void onStop() { 
    super.onDestroy(); //I was calling the wrong super 
} 
相關問題