【发布时间】: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");
}
这是我目前的发现:
-
onSaveInstanceState()将被调用,但onRestoreInstanceState()不会被调用 - 当我尝试将 View 直接添加到 Activity 的根目录时,它会调用这两个函数。
- 发现Activity的onRestoreState函数会在
ViewPager调用适配器的instantiateItem()函数之前被调用。因此,当活动恢复其状态时,ViewPager还没有任何孩子,因此 savedState 不属于任何人
所以我发现我需要做以下两件事之一:
- 确保
ViewPager在尝试恢复状态之前实例化项目,或者 - 手动调用 CustomView 的
onRestoreInstanceState()。
我以某种方式设法制作了选项 2,但有什么办法可以做选项 1?
【问题讨论】:
-
您找到解决方法了吗?我也面临同样的问题...
-
@sockeqwe 现在我只能不做。 2 手动调用 CustomView 的 onRestoreInstanceState 并提供来自 SparseArray 的状态。
-
看起来这是 ViewPager 的预期行为,并且在 FragmentStatePagerAdapter 中的 Fragments 没有真正删除时,它可以解决。当 ViewPager 使用 Views 而不是 Fragments 时,希望看到一些适当的解决方案