带有fragmentstatepageradapter的Viewpager不会在之前的片段上调用oncreateview



我的viewpager设置为offscreenpagelimit 1(默认)

当我滚动我的viewpager到右边,oncreateview被调用片段与当前位置+1准备下一个片段。

但是当我滑动到第三个片段并返回到第二个,第一个片段的oncreateview不被调用。

为什么viewpager的行为像这样,我怎么能预加载以前的片段如果它们被从记忆中删除了呢?

viewPager的行为是这样的,因为fragmentStatePagerAdapter正在保存它的视图。在第一次运行时,您将始终看到为n+1片段调用onCreateView()。但是如果你滑动所有的Fragments,它们的视图已经在FragmentStatePagerAdapter中了。当然,由于内存管理的原因,PagerAdapter可能会销毁一些视图(和Fragment)。

让我们假设发生这种情况:片段X被销毁。所以如果你滑动片段,你在片段y上,片段X在屏幕外页面限制内。FragmentStatePagerAdapter将注意到没有可用的片段,并将重新创建它。在这种情况下,onCreateView()将被再次调用。

如果你想预加载状态,这是在Fragment被销毁之前,那么你需要使用回调onSaveInstanceState()。

下面是一个例子:

保存Fragment的状态:

@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;
}

这段代码取自这里。

最新更新