Android互換性ライブラリを使用しており、時々奇妙なNullPointerException
を取得します:
Java.lang.NullPointerException
at Android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.Java:960)
at Android.support.v4.app.FragmentManagerImpl.performPendingDeferredStart(FragmentManager.Java:768)
at Android.support.v4.app.FragmentManagerImpl.startPendingDeferredFragments(FragmentManager.Java:1104)
at Android.support.v4.app.LoaderManagerImpl$LoaderInfo.onLoadComplete(LoaderManager.Java:410)
at Android.support.v4.content.Loader.deliverResult(Loader.Java:103)
at Android.support.v4.content.CursorLoader.deliverResult(CursorLoader.Java:81)
at Android.support.v4.content.CursorLoader.onStartLoading(CursorLoader.Java:126)
at Android.support.v4.content.Loader.startLoading(Loader.Java:197)
at Android.support.v4.app.LoaderManagerImpl$LoaderInfo.start(LoaderManager.Java:262)
at Android.support.v4.app.LoaderManagerImpl.doStart(LoaderManager.Java:710)
at Android.support.v4.app.Fragment.onStart(Fragment.Java:981)
at Android.support.v4.app.Fragment.performStart(Fragment.Java:1332)
at Android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.Java:906)
at Android.support.v4.app.FragmentManagerImpl.attachFragment(FragmentManager.Java:1240)
at Android.support.v4.app.BackStackRecord.run(BackStackRecord.Java:612)
at Android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.Java:1416)
at Android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.Java:431)
at Android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.Java:139)
at Android.support.v4.view.ViewPager.populate(ViewPager.Java:804)
at Android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.Java:433)
at Android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.Java:405)
at Android.support.v4.view.ViewPager.setCurrentItem(ViewPager.Java:386)
...
明らかに、私はFragmentManager
がこのようにクラッシュする可能性のある状態に入るのを許可するために何か間違っていますが、私には何の手掛かりがありません。 FragmentManagerImpl
の- 関連コード は、私に手掛かりを提供していません。コードのその時点でmActivity
はどういうわけかnull
だと思いますか?しかし、アクティビティはすでに画面上にあり、フラグメントを追加していないため、ViewPager
でそれらを切り替えるだけで、それは不可能に思えます。
わかりました。しばらくの間、レンガの壁に頭をぶつけた後、これがsetRetainInstance(true)
のフラグメントの宣言に直接関連付けられていることがわかりました。これを削除した後、問題はなくなりました。これは互換性ライブラリのバグのようです...
私は適切なGoogleプロジェクトの下で何かを調達します。あなたがこれをゆっくりとすすり泣きながら読んでいるなら、幸運を祈ります!これで問題を回避できると思います。
数日前にこのエラーが発生し、かなり混乱していましたが、FragmentTransaction
が保留中のトランザクションを取得していないようで、executePendingTransactions();
A NPE
これと同じように投げられました。
すべてのトランザクションが実際に何かを変更したことを確認することで解決しました(つまり、フラグメント1を追加->フラグメント1を削除->コミット/実行が機能しません)。
また、ページャーのフラグメントがnull
になっていないことを確認してください。
フラグメント自体ではなく、ビューページャーアダプターでフラグメントのインスタンスを参照していたため、同じエラーが発生していました。
フラグメントが呼び出されるたびにフラグメントの新しいインスタンスを作成すると、このエラーが解決されました。明らかにこれは適切なプログラミングですが、他の初心者が間違いを犯している場合に備えて...
@Override
public Fragment getItem(int position) {
if(position == 0)
return new Walkthrough_Fragment_1();
if(position == 1)
return new Walkthrough_Fragment_4();
if(position == 2)
return new Walkthrough_Fragment_2();
else{
return new Walkthrough_Fragment_3();
}
}
このバグは、setRetainInstance(true)
を使用するFragment内でFragmentPagerAdapter
を使用すると発生します。
setRetainInstance(true)
を維持したい場合は、@-Marcの回答 この質問 を使用できます。
@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
//do nothing here! no call to super.restoreState(arg0, arg1);
}
ある時点で、初期化されていないFragmentManagerクラスのインスタンスを使用しています。そのポイントを見つけ、オブジェクトを適切に初期化します。
コンパイル時に追加されたフラグメントで特定のトランザクションを実行できないことを読んだだけです。たとえば、フラグメントがXMLで定義されていて、それを置き換えようとした場合は、ブームです。