28

私は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です。

4

7 に答える 7

32

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

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

于 2012-07-12T09:37:19.373 に答える
5

数日前にこのエラーが発生し、かなり混乱していましたがFragmentTransaction、保留中のトランザクションを取得していないように見えたため、このようなexecutePendingTransactions();Aを呼び出すとNPEスローされたことがわかりました。
すべてのトランザクションが実際に何かを変更したことを確認することで問題を解決しました(つまり、フラグメント1->フラグメント1->コミット/実行が機能しない)。
また、ページャー内のフラグメントが。になっていないことを確認してnullください。

于 2012-05-04T21:33:28.987 に答える
3

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

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

@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();
    }
}
于 2014-08-04T15:18:21.607 に答える
1

このバグは、を使用FragmentPagerAdapterするフラグメント内で使用する場合に発生しますsetRetainInstance(true)

維持したい場合は、この質問setRetainInstance(true)の@Marc回答を使用できます。

@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
    //do nothing here! no call to super.restoreState(arg0, arg1);
}
于 2015-05-06T08:52:48.933 に答える
0

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

于 2012-05-04T21:15:42.843 に答える
0

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

于 2012-05-10T18:22:31.353 に答える
-1

FragmentManagerを静的グローバル変数として作成し、onCreateメソッドで初期化することで問題を解決しました。getSupportFragmentManager()が古いフラグメントマネージャーの値を指している可能性があり、参照されていない可能性があるため、コード内のあらゆる場所でgetSupportFragmentManager()を使用するとこの例外が発生する可能性があることがわかりました。

次に例を示します。

  public class yourClass{

      private static FragmentManager myFragmentManagerSupport; 
      ...

        @Override
        public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
          myFragmentManagerSupport = this.getSupportFragmentManager();

              ....

          }

         /*Then reuse myFragmentManagerSupport  everywhere you needed instead of  
         *                     getSupportFragmentManager()
         */

    }

お役に立てば幸いです。

于 2013-09-13T03:53:47.177 に答える