web-dev-qa-db-ja.com

FragmentManagerのNullPointerException

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でそれらを切り替えるだけで、それは不可能に思えます。

28
mlc

わかりました。しばらくの間、レンガの壁に頭をぶつけた後、これがsetRetainInstance(true)のフラグメントの宣言に直接関連付けられていることがわかりました。これを削除した後、問題はなくなりました。これは互換性ライブラリのバグのようです...

私は適切なGoogleプロジェクトの下で何かを調達します。あなたがこれをゆっくりとすすり泣きながら読んでいるなら、幸運を祈ります!これで問題を回避できると思います。

32
OceanLife

数日前にこのエラーが発生し、かなり混乱していましたが、FragmentTransactionが保留中のトランザクションを取得していないようで、executePendingTransactions(); A NPEこれと同じように投げられました。
すべてのトランザクションが実際に何かを変更したことを確認することで解決しました(つまり、フラグメント1を追加->フラグメント1を削除->コミット/実行が機能しません)。
また、ページャーのフラグメントがnullになっていないことを確認してください。

5
Jave

フラグメント自体ではなく、ビューページャーアダプターでフラグメントのインスタンスを参照していたため、同じエラーが発生していました。

フラグメントが呼び出されるたびにフラグメントの新しいインスタンスを作成すると、このエラーが解決されました。明らかにこれは適切なプログラミングですが、他の初心者が間違いを犯している場合に備えて...

@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();
    }
}
3
MarcusM.

このバグは、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);
}
1
vithoriop

ある時点で、初期化されていないFragmentManagerクラスのインスタンスを使用しています。そのポイントを見つけ、オブジェクトを適切に初期化します。

0
Antony

コンパイル時に追加されたフラグメントで特定のトランザクションを実行できないことを読んだだけです。たとえば、フラグメントがXMLで定義されていて、それを置き換えようとした場合は、ブームです。

0
MikeWallaceDev