我的viewpager设置为offscreenpagelimit 1(默认值)
当我向右移动我的viewpager时,会在片段上调用oncreateview,当前位置为+1,以准备下一个片段。
但是当我滑动到第3个片段并返回第二个片段时,第一个片段的oncreateview不会被调用。
为什么viewpager的行为与此类似,我如何预加载以前的片段 如果他们被从记忆中删除?
答案 0 :(得分:1)
viewPager的行为与此类似,因为fragmentStatePagerAdapter正在保存其视图。在第一次运行时,您将看到为n + 1片段调用onCreateView()。但是如果你翻过了所有片段,他们的视图已经在FragmentStatePagerAdapter中了。 当然,由于内存管理原因,可能会发生PagerAdapter会破坏某些视图(和片段)。
让我们假设这种情况发生了:片段X被破坏了。 因此,如果你翻过你的碎片,你就在碎片Y.片段X在你的offscreenpagelimit。 FragmentStatePagerAdapter会注意到没有可用的片段并将重新创建它。在这种情况下,将再次调用onCreateView()。
如果你想预加载片段被破坏之前的状态,那么你需要使用回调onSaveInstanceState()。
以下是一个例子:
保存片段的状态:
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.v(TAG, "In frag's on save instance state ");
outState.putSerializable("starttime", startTime); //saves the object variable
}
恢复状态:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.v(TAG, "In frag's on create view");
View view = inflater.inflate(R.layout.fragment_data_entry, container,
false);
timeTV = (TextView) view.findViewById(R.id.time_tv);
if ((savedInstanceState != null)
&& (savedInstanceState.getSerializable("starttime") != null)) {
startTime = (Calendar) savedInstanceState
.getSerializable("starttime");
}
return view;
}
此代码取自here。您可以在此站点上获得有关此内容的更多信息。