【问题标题】:Android - How to restore state of ViewPager's itemsAndroid - 如何恢复 ViewPager 项目的状态
【发布时间】:2016-02-17 15:59:56
【问题描述】:

我无法在ViewPager 中恢复View 的状态。 ViewPager 的内容是扩展FrameLayout 的视图。

问题是如果以编程方式将FrameLayout.onRestoreInstanceState() 添加到ViewPager 中,则不会调用ViewPager

这是我Activity.java的代码

private ViewPager vPager;
private MainPagerAdapter mAdapter;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    setContentView(R.layout.activity_layout);
    // all the findViewById stuff

    CustomView cv1 = new CustomView(this);
    CustomView cv2 = new CustomView(this);

    cv1.setId(R.id.custom_view_id_1);
    cv2.setId(R.id.custom_view_id_2);

    mAdapter = MainPagerAdapter();
    mAdapter.addView(cv1);
    mAdapter.addView(cv2);
    vPager.setAdapter(mAdapter);
}

MainPagerAdapter 是来自this question 接受答案的类

CustomView.java的源代码

@Override
protected Parcelable onSaveInstanceState() {
    Log.d(TAG, "onSaveInstanceState() called");
}

@Override
protected void onRestoreInstanceState(Parcelable state) {
    Log.d(TAG, "onRestoreInstanceState() called");
}

这是我目前的发现:

  1. onSaveInstanceState() 将被调用,但 onRestoreInstanceState() 不会被调用
  2. 当我尝试将 View 直接添加到 Activity 的根目录时,它会调用这两个函数。
  3. 发现Activity的onRestoreState函数会在ViewPager调用适配器的instantiateItem()函数之前被调用。因此,当活动恢复其状态时,ViewPager 还没有任何孩子,因此 savedState 不属于任何人

所以我发现我需要做以下两件事之一:

  1. 确保ViewPager 在尝试恢复状态之前实例化项目,或者
  2. 手动调用 CustomView 的onRestoreInstanceState()

我以某种方式设法制作了选项 2,但有什么办法可以做选项 1?

【问题讨论】:

  • 您找到解决方法了吗?我也面临同样的问题...
  • @sockeqwe 现在我只能不做。 2 手动调用 CustomView 的 onRestoreInstanceState 并提供来自 SparseArray 的状态。
  • 看起来这是 ViewPager 的预期行为,并且在 FragmentStatePagerAdapter 中的 Fragments 没有真正删除时,它可以解决。当 ViewPager 使用 Views 而不是 Fragments 时,希望看到一些适当的解决方案

标签: java android


【解决方案1】:

如果我理解您的问题,您可以使用mPage.setOffscreenPageLimit(4); 保存您的 ViewPager 项目状态@ 4 是我在 ViewPager 中的片段数。

【讨论】:

  • 这样做并不能解决问题。调用.setOffscreePageLimit(int) 意味着片段将被保留,即使它没有显示在屏幕上。想象一下,如果片段的数量很大(几十个或几百个),那么性能就会受到影响。
  • 好的,那你想要什么?因为我不明白你的问题,你的意思是说恢复 ViewPager 项目的状态
  • 它基本上是如何使用onSaveInstanceState()onRestoreInstanceState(),就像Activity 中的那个一样,但是这个在自定义ViewGroup 的状态下放入ViewPager 时。跨度>
  • stackoverflow.com/questions/31013996/… 。试试这个,我想这会对你有所帮助。
  • 谢谢。但我认为这是针对片段的,而我的情况是针对 ViewGroup 的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多