【发布时间】:2013-11-14 10:48:56
【问题描述】:
我有一个有 7 个页面的 ViewPager,我在导航时保留了其中的 4 个,并且在被另外 4 个集合替换后被销毁,然后是 GC。
gPager.get().setOffscreenPageLimit(4);
在我的自定义FragmentStatePagerAdapter中
@Override public Parcelable saveState() { return null; }
我的问题是我收到空指针错误,即使我在 Fragment 像“mDrawerLayout”和mDrawerList 一样被销毁后手动重新初始化了视图。示例:
View rootView = inflater.inflate(R.layout.drawer_layout_fragment, container, false);
mDrawerLayout = (DrawerLayout) rootView.get().findViewById(R.id.drawer_layout);
mDrawerList = (ListView) rootView.get().findViewById(R.id.left_drawer);
如果其他 Fragment 被销毁并且一些正在 ViewPager 页面的屏幕上显示。这些片段是再次重新创建还是只是保留了,即使它经历了onDestory?
如果Frag2 被销毁而Frag1 未被销毁。 viewPager(位于主活动中)是否会
再次致电setAdapter?或者它会自动跳过setAdapter,直接去MyCustomPagerAdapter填充被破坏的片段?
@Override
public Fragment getItem(int arg0) {
SavePref saveState = new SavePref(mContext.get());
switch(arg0){
/** Android tab is selected */
case 0:
Frag f1 = new Frag1()
return f1;
case 1:
Frag f2 = new Frag2()
return f2;
}
}
【问题讨论】:
-
首先
setOffscreenPageLimit(4)表示当前选中的fragment两边的4会保存在内存中。因此,您可能会在内存中保留 8 个片段,不包括当前显示的片段。其次让FragmentStatePagerAdapter保存状态,不要覆盖saveState()。 -
@M-WaJeEh 我正在使用覆盖
saveState,因为我没有也不会使用onConfig Changes,因此当有orientation change时我可以保留片段状态不会触发null指针。即使没有方向更改,这是否会影响导航? -
我不明白你在说什么。此方法适用于
FragmentStatePagerAdapter。你不想FragmentStatePagerAdapter保存你的片段状态吗? -
如果您担心 Fragment 的方向变化,请使用 Fragment 的
onCreate方法内的setRetainInstance(true)方法来保留 Fragment,即使 Activity 被销毁。建议甚至在创建 @ 时使用此方法987654343@ 必须在配置更改后报告给新的Activity。
标签: java android android-fragments android-viewpager navigation-drawer