FragmentStatePagerAdapter 和 ChildFragmentManager - FragmentManagerImpl.getFragment 导致 NullPointerException [英] FragmentStatePagerAdapter with ChildFragmentManager - FragmentManagerImpl.getFragment results in NullPointerException
问题描述
编辑 2
我现在设法通过使用这里的技巧摆脱了错误https://code.google.com/p/android/issues/detail?id=42601#c10 所以这就是为什么我的最后一次编辑放在我的问题之上的原因.
I now managed to get rid of the error with using the trick from here https://code.google.com/p/android/issues/detail?id=42601#c10 so that's the reoson why my last edit is placed on top of my question.
但这导致了下一个错误:
But this led to the next error:
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)
现在我不知道从哪里继续...
And now I don't know where to continue...
编辑 0 - 第一个问题
我收到以下异常:
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).
I have no idea where to start. I'm using the up to date support library (v4, rev18).
一切正常,直到我添加了一个 Fragment
,其中包含一个 ViewPager
和 FragmentStatePagerAdapter
.
Everything works fine until I add a Fragment
which holds a ViewPager
in combination with FragmentStatePagerAdapter
.
我到处都在使用支持库,我尝试了 中的解决方案https://code.google.com/p/android/issues/detail?id=42601...
I'm using the support library everywhere, I tried the solutions from https://code.google.com/p/android/issues/detail?id=42601...
但还没有任何效果...
But nothing worked yet...
我不知道从哪里开始,有人有提示吗?
I don't know where to start, does anyone have a hint?
编辑 1:背景和代码
1) 在我的 MainActivity 中,我使用以下内容:
第三页有viewpager...
The third page has the 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 的简单 Fragment.FragmentStatePagerAdapter 将 getChildFragmentManager()
作为 FragmentManager.某处似乎有问题.
It's a simple Fragment with a ViewPager and a FragmentStatePagerAdapter. The FragmentStatePagerAdapter get's the getChildFragmentManager()
as FragmentManager. And somewhere there seems to be the problem.
推荐答案
我需要查看更多代码才能知道在哪里应用它...但我遇到了与您类似的情况...我解决了ChildFragmentManager
以相同的方式发出,并得到与您相同的 NullPointerException
.
I would need to see more code in order to know where to apply this ... but I had a similar situation as you did... I solved the ChildFragmentManager
issue the same way, and got the same NullPointerException
, as you have.
我确实设法解决了它......我会尝试描述我的解决方案,就像你提供的代码一样我不确定在哪里应用修复"......这真的是一个修复......这不是解决这个问题的优雅方法!然而,它确实帮助了我,一旦我在视图寻呼机上导航离开,我就不需要恢复状态,所以对我来说没有缺点.
I did manage to solve it... I'll try to describe my solution, as with the code you supplied I am unsure as to where to apply the "fix" ... It really is a fix ... it's not an elegant way to solve this! It did however helped me, and I don't need to restore states once I navigate away on the view Pager, so no downside for me.
我有多个片段,它们实现了静态代码和 onDetach(在 https://code.google.com/p/android/issues/detail?id=42601#c10),每个片段都有一个寻呼机,在 onCreateView 我附加了一个扩展 FragmentStatePagerAdapter 的适配器.
I have multiple Fragments, that implement the static bit of code and the onDetach (on https://code.google.com/p/android/issues/detail?id=42601#c10), each fragment has a pager, and onCreateView I attach an adapter that extends FragmentStatePagerAdapter.
在这些适配器上,我重写了 restoreState 方法,什么也不做
on those adapters I have overridden the restoreState method to do nothing
@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
//do nothing here! no call to super.restoreState(arg0, arg1);
}
再说一次,这不是最好的方法……但它确实解决了我的问题.
Again, this is not the best way... but it did solve my problem.
祝你好运!
这篇关于FragmentStatePagerAdapter 和 ChildFragmentManager - FragmentManagerImpl.getFragment 导致 NullPointerException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!