【问题标题】:NullPointerException in FragmentManagerFragmentManager 中的 NullPointerException
【发布时间】:2012-05-14 10:13:21
【问题描述】:

我正在使用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 中的 relevant code 没有为我提供任何线索。我猜mActivity 在代码中以某种方式是null?但这似乎是不可能的,因为活动已经在屏幕上,而且我没有向它添加任何片段 - 只是在 ViewPager 中切换它们。

【问题讨论】:

  • 请包含您的代码
  • 你特别想看什么代码?堆栈跟踪中的任何位置都没有。
  • 全部?如果没有代码示例,我们将无法帮助您。无论您在哪里使用FragmentManager,都至少可以发布帖子。更改片段时会发生崩溃吗?发布如何更改片段的代码。等等
  • 我已经开始看到这个崩溃,但只是在使用 ProGuard 混淆之后。还有什么建议吗?
  • @seufagner 那里的堆栈跟踪显然与这里的不一样,唉。

标签: java android android-fragments android-support-library


【解决方案1】:

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

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

【讨论】:

  • 我最近遇到了同样的事情,我根本没有使用 FragmentManager(只是通过 xml 实例化)。它只发生在带有硬件键盘的 2.3 设备上。当我关闭键盘时……咔嚓。
  • +1。今天遇到了同样的问题:)。直到那一刻 NPE @FragmentManagerImpl.moveToState() 在方向改变后在片段之间切换时,一切看起来都很好。 :))))。 JFYI 它发生在 4.1.1。
  • 真的看起来像一个兼容性库错误。你有没有在什么地方养过它?如果是,请链接到它,以便我们对其进行投票。
  • 将近 3 年后,删除 setRetainInstance(true) 似乎已经成功了。感谢海洋生物
【解决方案2】:

几天前我得到了这个错误并且很困惑,但我发现这是因为FragmentTransaction似乎没有得到任何待处理的交易所以当调用executePendingTransactions();NPE就像这样一个被扔了。
我通过确保每个事务实际上都改变了一些东西来解决它(即添加片段 1 -> 删除片段 1 -> 提交/执行不起作用)。
还要确保寻呼机中的所有片段都没有变成null

【讨论】:

  • 我刚刚尝试反复添加executePendingTransactions,但无法让它崩溃,但我仍然很少遇到这些崩溃,不知道为什么
【解决方案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();
    }
}

【讨论】:

    【解决方案4】:

    在使用 setRetainInstance(true) 的 Fragment 中使用 FragmentPagerAdapter 时会出现此错误。

    如果您想维护setRetainInstance(true),您可以使用来自This question 的@Marc 答案:

    @Override
    public void restoreState(Parcelable arg0, ClassLoader arg1) {
        //do nothing here! no call to super.restoreState(arg0, arg1);
    }
    

    【讨论】:

      【解决方案5】:

      在某些时候,您正在使用未初始化的 FragmentManager 类的实例。找到该点并正确初始化对象。

      【讨论】:

      • 是的,这为我解决了这个问题。只需在 onCreate() 中初始化 FragmentManager
      【解决方案6】:

      我刚刚读到您不能对在编译时添加的片段执行某些事务。例如,如果您的 Fragment 是在 XML 中定义的,而您尝试替换它,那就太好了。

      【讨论】:

        【解决方案7】:

        我通过将我的 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()
                 */
        
            }
        

        希望对您有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-03
          • 2023-03-31
          • 1970-01-01
          • 1970-01-01
          • 2019-02-14
          • 2013-07-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多