【问题标题】:ViewPager inside Fragment doesn't restore child fragments' state片段内的 ViewPager 不会恢复子片段的状态
【发布时间】:2015-11-02 16:34:59
【问题描述】:

我有一个问题。我有一个片段,里面包含viewpager。对于viewpager,我使用 FragmentPagerAdapter 扩展。每个pager fragment 里面都有recycler views。 问题是我无法在recycler views 的viewpager 内旋转屏幕后恢复滚动位置。我以为问题出在recyclerview,但很快我发现viewpager 内的屏幕旋转片段正在重新创建,所以onCreate() 和onDestroy() 被调用,即使它们不应该。我也试过使用onSaveInstanceState(bundle),发现在onCreateView()里面这个包总是空的。所以我该怎么做? This 主题对我没有帮助。

【问题讨论】:

  • 你可以尝试使用 mViewPager.setOffscreenPageLimit(limit);
  • @dex,我试过了。它没有帮助我。实际上,这不应该是因为 viewpager 在我滑动它时会保存片段的状态,但是当我旋转屏幕时,位置会丢失。对不起我的英语

标签: android android-fragments android-viewpager


【解决方案1】:

嗯,我找到了答案。问题出在我身上)。有层次结构:带有片段框架布局的 MainActivity - PagerFragment 包含 viewpager - viewpager 内的 fagments。问题是,在活动内部旋转屏幕后,我总是替换 PagerFragment,例如:

android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragment = new PagerFragment();
fragmentTransaction.replace(R.id.fragment_container, fragment);
fragmentTransaction.commit();

但我应该这样做:

Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
if (fragment == null) {
        android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragment = new PagerFragment();
        fragmentTransaction.replace(R.id.fragment_container, fragment);
        fragmentTransaction.commit();
}

这完全是我的错,我很惭愧。对不起。

【讨论】:

  • 或if (savedInstanceState == null)。
【解决方案2】:

您可以使用 null 状态覆盖 PagerAdapter 中的函数。

override fun restoreState(state: Parcelable?, loader: ClassLoader?) {
        super.restoreState(null, loader)
    }

【讨论】:

    【解决方案3】:

    这两个覆盖应该可以解决您的问题

    在这里你保存你的价值观

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

    在这里你可以恢复它

    @Override
    public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
        super.onViewStateRestored(savedInstanceState);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-04
      • 2014-04-25
      相关资源
      最近更新 更多