android - 在哪里恢复 ViewPager 内部的 fragment 状态

标签 android android-fragments android-viewpager fragment-lifecycle

简短版本:

我有一个带有 ViewPager 的 Activity 。 ViewPager 内部包含三个 fragment 。我通过实现 Parcelable 并将其存储在包中来将数据存储在 fragment 中。

现在的问题是我在哪里恢复数据。我很困惑,因为(据我所知)每次我旋转屏幕时 ViewPager 都会创建一个新的 fragment 实例。 (创建了一个新 Activity -> 新 ViewPager -> 新 fragment )。如果我错了,请纠正我。

长版:

我在 MainActivity 中的 ViewPager

ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
viewPager.setAdapter(new ForecastFragmentPageAdapter(getSupportFragmentManager(),
            ForecastActivity.this));
viewPager.setOffscreenPageLimit(2);

我的 FragmentPagerAdapter

 @Override
public Fragment getItem(int position) {
    if (position == 0) {
        return new NowForecastFragment();
    } else if (position == 1) {
        return new HourlyForecastFragment();
    } else {
        return new DailyForecastFragment();
    }
}

在我的一个 fragment 中保存状态

    public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    // save data source
    if (nowDataList != null) {
        outState.putParcelableArrayList("savedNowDataList", nowDataList);
    }
}

提前致谢!

更新:

根据针对类似问题发布的其他解决方案,我还在 fragment 的 onCreateView 中添加了 setRetainInstance(true); 。这就是我保存和恢复状态的方式:

    @Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    // save data source
    if (nowDataList != null) {
        Log.v("---------------->","saved!");
        outState.putParcelableArrayList("savedNowDataList", nowDataList);
    }
}

并在 onCreateView 中恢复

 if(savedInstanceState!=null) {
            Log.v("---------------->","restored!");
            nowDataList = savedInstanceState.getParcelableArrayList("savedNowDataList");
            nowForecastAdapter.notifyDataSetChanged();
        }

我看到两个日志都被触发了。为什么数据没有恢复?

最佳答案

ViewPager 保存其状态时,它会在其适配器上调用 saveState()。同样,当 ViewPager 恢复其状态时,它会调用适配器上的 restoreState

您可以实现这些方法,但这已经完成了。只需扩展 FragmentStatePagerAdapter 而不是 FragmentPagerAdapter 即可免费获得这些方法实现。

如果您扩展 FragmentStatePagerAdapter 然后实现 onSaveInstanceState() 并为您的 Fragment 恢复 onCreateView() 中的状态> 类,所有这些都应该按预期工作。

关于android - 在哪里恢复 ViewPager 内部的 fragment 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31013996/

相关文章:

android - Fragments - 指定的 child 已经有一个 parent 。您必须先在 child 的 parent 上调用 removeView()

java - 保存和检索 v4 fragment 状态

android - 嵌套 fragment 在方向更改时创建两次

android - 将 Viewpager 作为标题添加到 listView

android - 无法获取设置按钮以显示动态壁纸

android - 为什么它会提示找不到一个库,即使我已经包含了它?

android - 如何使 map 在标记上居中单击以显示整个 InfoWindow

java - Jsoup:获取文本和网址

android - 用包含 viewpager 的 fragment 替换 fragment 时崩溃

android - 如果我以这种方式使用 fragment ,如何在 viewpager 中保存 fragment 的状态?