【发布时间】:2015-10-02 15:17:20
【问题描述】:
我对此感到茫然。我在 ViewPager 中手动切换标签。我的 Activity 中有这段代码:
@Override
public void onBackPressed()
{
if (childFragmentStack.empty())
{
// Go to the devices screen
Intent intent = new Intent(this, SelectDeviceActivity.class);
startActivity(intent);
}
else
{
Fragment fragment = childFragmentStack.pop();
if (fragment == null)
{
return;
}
processingBackStack = true;
if (fragment instanceof ViewChildFragment)
{
viewFragment.activateFragment((ViewChildFragment) fragment);
mViewPager.setCurrentItem(VIEW_FRAGMENT_INDEX, true);
}
else if (fragment instanceof SetupChildFragment)
{
setupFragment.activateFragment((SetupChildFragment) fragment);
mViewPager.setCurrentItem(SETUP_FRAGMENT_INDEX, true); //**
}
else if (fragment == homeFragment)
{
mViewPager.setCurrentItem(HOME_FRAGMENT_INDEX, true); //**
}
processingBackStack = false;
}
}
如果我在标签之间滚动,我会将它们添加到堆栈('childFragmentStack')中。我正在使用 FragmentPagerAdapter 来处理片段。发生的情况是,如果我执行 View->Setup->View->Setup 之类的操作,然后将其反转,它只会到达 Setup->View->CRASH。就像当我按下 Back 时,Setup Fragment 对于我正在做的事情不再有效,但它永远不会重新创建! Setup 片段仅在 MainActivity.onCreate() 中创建,因此它应该仍然存在且有效。
NPE 发生在我标记为 ** 的行上。这是完整的堆栈跟踪:
04-18 16:04:57.096: E/AndroidRuntime(13072): FATAL EXCEPTION: main
04-18 16:04:57.096: E/AndroidRuntime(13072): java.lang.NullPointerException
04-18 16:04:57.096: E/AndroidRuntime(13072): at android.support.v4.app.Fragment.setUserVisibleHint(Fragment.java:841)
04-18 16:04:57.096: E/AndroidRuntime(13072): at android.support.v4.app.FragmentPagerAdapter.setPrimaryItem(FragmentPagerAdapter.java:130)
04-18 16:04:57.096: E/AndroidRuntime(13072): at android.support.v4.view.ViewPager.populate(ViewPager.java:1066)
04-18 16:04:57.096: E/AndroidRuntime(13072): at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:550)
04-18 16:04:57.096: E/AndroidRuntime(13072): at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:509)
04-18 16:04:57.096: E/AndroidRuntime(13072): at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:501)
04-18 16:04:57.096: E/AndroidRuntime(13072): at com.lochinvar.serf.MainActivity.onBackPressed(MainActivity.java:234)
04-18 16:04:57.096: E/AndroidRuntime(13072): at android.app.Activity.onKeyUp(Activity.java:2131)
04-18 16:04:57.096: E/AndroidRuntime(13072): at android.view.KeyEvent.dispatch(KeyEvent.java:2633)
04-18 16:04:57.096: E/AndroidRuntime(13072): at android.app.Activity.dispatchKeyEvent(Activity.java:2361)
04-18 16:04:57.096: E/AndroidRuntime(13072): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1819)
04-18 16:04:57.096: E/AndroidRuntime(13072): at android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:3577)
04-18 16:04:57.096: E/AndroidRuntime(13072): at android.view.ViewRootImpl.handleImeFinishedEvent(ViewRootImpl.java:3547)
04-18 16:04:57.096: E/AndroidRuntime(13072): at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:2797)
04-18 16:04:57.096: E/AndroidRuntime(13072): at android.os.Handler.dispatchMessage(Handler.java:99)
04-18 16:04:57.096: E/AndroidRuntime(13072): at android.os.Looper.loop(Looper.java:137)
04-18 16:04:57.096: E/AndroidRuntime(13072): at android.app.ActivityThread.main(ActivityThread.java:4745)
04-18 16:04:57.096: E/AndroidRuntime(13072): at java.lang.reflect.Method.invokeNative(Native Method)
04-18 16:04:57.096: E/AndroidRuntime(13072): at java.lang.reflect.Method.invoke(Method.java:511)
04-18 16:04:57.096: E/AndroidRuntime(13072): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
04-18 16:04:57.096: E/AndroidRuntime(13072): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
04-18 16:04:57.096: E/AndroidRuntime(13072): at dalvik.system.NativeStart.main(Native Method)
[编辑] 我忘了提到我覆盖了 FragmentPagerAdapter.getPageTitle() 并且它从不返回 null (默认情况下转到字符串)。
【问题讨论】:
-
mViewPager 好像是空的,有什么地方可以设置成空的吗?
-
堆栈跟踪在 Fragment.setUserVisibleHint() 中有异常,所以我认为不是因为 mViewPager 为空。不,它不是 null - 它只在 onCreate() 中分配,在其他任何地方都没有。
-
发布您的适配器代码,以及
activateFragment方法的作用。