带有ChildFragmentManager的FragmentStatePagerAdapter – FragmentManagerImpl.getFragment导致NullPointerException

编辑2

我现在设法摆脱错误,使用从这里https://code.google.com/p/android/issues/detail?id=42601#c10的技巧,所以这是重申为什么我最后一次编辑放在上面我的问题。

但是这导致了下一个错误:

java.lang.NullPointerException at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:569) at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:211) at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:1281) at android.view.View.dispatchRestoreInstanceState(View.java:12043) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2688) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2694) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2694) at android.view.View.restoreHierarchyState(View.java:12021) at android.support.v4.app.Fragment.restoreViewState(Fragment.java:425) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:949) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460) at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440) at android.os.Handler.handleCallback(Handler.java:615) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4800) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565) at dalvik.system.NativeStart.main(Native Method) 

而现在我不知道该继续…

编辑0 – 第一个问题

我得到以下exception:

 java.lang.IllegalStateException: No activity at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1091) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086) at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1877) at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1492) at android.support.v4.app._HoloFragment.performActivityCreated(_HoloFragment.java:251) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460) at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440) at android.os.Handler.handleCallback(Handler.java:615) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4800) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565) at dalvik.system.NativeStart.main(Native Method) 

我不知道从哪里开始。 我正在使用最新的支持库(v4,rev18)。

一切工作正常,直到我添加一个持有ViewPagerFragmentStatePagerAdapter结合的FragmentStatePagerAdapter

我正在使用支持库,我尝试了解决schemehttps://code.google.com/p/android/issues/detail?id=42601 …

但没有任何工作…

我不知道从哪里开始,有没有人有提示?

编辑1:背景和代码

1)在我的MainActivity中,我使用以下内容:

第三页有viewpager …

 public void setPage(int pos, boolean addToBackStack) { Fragment nextFragment = null; FragmentTransaction transaction = null; switch (pos) { case 0: if (mFragmentAllRoutines == null) mFragmentAllRoutines = new RoutinesListFragment(); if (!mFragmentAllRoutines.isVisible()) nextFragment = mFragmentAllRoutines; break; case 1: if (mFragmentRoutine == null) mFragmentRoutine = new RoutineFragment(); if (!mFragmentRoutine.isVisible()) nextFragment = mFragmentRoutine; break; case 2: if (mFragmentDay == null) mFragmentDay = new RoutineDayFragment(); if (!mFragmentDay.isVisible()) nextFragment = mFragmentDay; break; default: break; } if (nextFragment != null) { // Fragment prevFragment = getSupportFragmentManager().findFragmentById(R.id.fragment); transaction = getSupportFragmentManager().beginTransaction(); // if (prevFragment != null) // transaction.detach(prevFragment); transaction.replace(R.id.fragment, nextFragment, nextFragment.getClass().getName()); // transaction.attach(nextFragment); if (addToBackStack) transaction.addToBackStack(null); transaction.commit(); } } 

2)第三个片段:

这是一个带有ViewPager和FragmentStatePagerAdapter的简单片段。 FragmentStatePagerAdapter获取的是作为FragmentManager的getChildFragmentManager() 。 似乎有什么地方存在这个问题。

Solutions Collecting From Web of "带有ChildFragmentManager的FragmentStatePagerAdapter – FragmentManagerImpl.getFragment导致NullPointerException"

我需要看到更多的代码才能知道在哪里应用这个…但是我也遇到过类似的情况…我以同样的方式解决了ChildFragmentManager问题,并得到了与您一样的NullPointerException

我设法解决它…我会试着描述我的解决scheme,就像你提供的代码一样,我不确定在哪里应用“修复”…这真的是一个修复…这不是一个优雅的方式解决这个问题! 它帮助了我,我不需要恢复状态,一旦我浏览视图寻呼机,所以没有任何缺点。

我有多个片段,实现静态代码和onDetach(在https://code.google.com/p/android/issues/detail?id=42601#c10 ),每个片段都有一个传呼机和onCreateView我附加了一个扩展FragmentStatePagerAdapter的适配器。

在这些适配器上,我已经覆盖了restoreState方法什么也不做

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

再次,这不是最好的方法…但它确实解决了我的问题。

祝你好运!

我刚刚偶然发现了同样的问题。

 java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:873) at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:215) 

由Marc的解决scheme工作,但在我的情况下,它导致与FragmentStatePagerAdapter的片段滞后。 所以我重写了restoreState,叫做super,把它封装在try / catch中,并且没有滞后。

 @Override public void restoreState(Parcelable state, ClassLoader loader) { try{ super.restoreState(state, loader); }catch (NullPointerException e){ // null caught } } 

在我这边,我保持对包含片段的ViewPager片段的引用,并使用onSaveInstanceState存储它们的状态。 我认为NPE发生是因为这与ViewPager自己的机制相冲突,以恢复碎片。 我做了什么,将我的架构从ViewPager更改为我pipe理自己的片段事务。 (ViewPager并不适合我的情况)

首先,英文不是我的母语,如果我的语法错了,请告诉我。 我在我的项目中遇到了这个问题。 起初我做了马克所说的,而且运作良好。 但是,当我在父片段中添加另一个ViewPager时,无论这个新viewpager中的代码如何,新的ViewPager都显示为与旧的相同。 最后我find了原因。 我们总是使用FragmentTrasaction.replace(R.layout.fragment,fragment)方法创buildFragment。 因此,我们使用这种方法创build一个新的片段实例。 我使用FragmentTransaction.hide()和show()方法来切换片段,而不是使用replace()方法。 我这样解决了我的问题。 这里是我的代码片段:

 @Override public void onClick(View v) { FragmentTransaction transaction = fm.beginTransaction(); switch (v.getId()) { case R.id.tv_schedule_day: hideFragment(transaction); if (dayFragment == null) { dayFragment = new ScheduleDayFragment(); transaction.add(R.id.ll_schedule_content, dayFragment); } else { transaction.show(dayFragment); } transaction.commit(); break; case R.id.tv_schedule_week: hideFragment(transaction); if (weekFragment == null) { weekFragment = new ScheduleWeekFragment(); transaction.add(R.id.ll_schedule_content, weekFragment); } else { transaction.show(weekFragment); } transaction.commit(); break; case R.id.tv_schedule_month: hideFragment(transaction); if (monthFragment == null) { monthFragment = new ScheduleMonthFragment(); transaction.add(R.id.ll_schedule_content, monthFragment); } else { transaction.show(monthFragment); } transaction.commit(); break; private void hideFragment(FragmentTransaction transaction) { if (dayFragment != null) { transaction.hide(dayFragment); } if (weekFragment != null) { transaction.hide(weekFragment); } if (monthFragment != null) { transaction.hide(monthFragment); } } 

我使用hide()和show()方法来创build切换父片段,所以当我在embedded片段中使用getChildFragmentManager()时,它不会返回null。 这个问题在2013年被问到了,我想没有人会看到这个答案,但是我仍然很高兴能够回答这个问题。