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没有为我提供任何线索。我猜mActivitynull在代码中的那个点?但这似乎是不可能的,因为活动已经在屏幕上,而且我没有向它添加任何片段 - 只是在ViewPager.

4

7 回答 7

32

好的,伙计们,在我的头撞到砖墙上一段时间后,我发现这与我的片段声明直接相关setRetainInstance(true)。删除它后,问题就消失了。这似乎是一个兼容性库错误......

我将在适当的 Google 项目下提出一些建议。祝你好运,如果你正在读这篇慢慢啜泣着的自己!我希望这能让你解决这个问题。

于 2012-07-12T09:37:19.373 回答
5

几天前我收到了这个错误并且很困惑,但我发现这是因为 aFragmentTransaction似乎没有得到任何待处理的交易,所以当调用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

我刚刚读到您不能对在编译时添加的片段执行某些事务。例如,如果您的 Fragment 是在 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 回答