【问题标题】:Viewpager with fragmentstatepageradapter does not call oncreateview on a previous fragment带有 fragmentstatepageradapter 的 Viewpager 不会在前一个片段上调用 ​​oncreateview
【发布时间】:2015-06-04 16:26:25
【问题描述】:

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

当我向右滚动查看器时,在当前位置 +1 的片段上调用 ​​oncreateview 以准备下一个片段。

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

为什么 viewpager 的行为是这样的,我如何预加载以前的片段 如果它们被从内存中删除?

【问题讨论】:

标签: android android-viewpager fragmentstatepageradapter


【解决方案1】:

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

假设发生这种情况:片段 X 被销毁。 因此,如果您在片段上滑动,并且您在片段 Y 上。片段 X 在您的 offscreenpagelimit 中。 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;
}

此代码取自here。您可以在此网站上获得更多信息。

【讨论】:

  • 这没有帮助。在第一次加载视图寻呼机时,我仍然没有看到元素 0 调用 onCreate 和 onCreateView。
  • 请查看我的分析以及我发现问题的方法stackoverflow.com/a/30968767/816635
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多