Fragment中的ViewPager不会恢复子片段的状态

时间:2015-11-02 16:35:00

标签: android android-fragments android-viewpager

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

3 个答案:

答案 0 :(得分:3)

好吧,我找到了答案。问题出在我身上)。有层次结构: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();
}

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

答案 1 :(得分:0)

您可以使用空状态覆盖PagerAdapter中的功能。

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

答案 2 :(得分:0)

这两个替代应该可以解决您的问题

在这里保存您的值

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

在这里您可以恢复它

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