ScrollView状态未保存在KitKat和更早版本中

时间:2016-02-17 21:47:49

标签: android

视图寻呼机上项目的滚动状态未在Android KitKat和旧设备上保存和恢复(此时我已经测试了API 15,17,19,22,23)

滚动视图位于具有视图寻呼机的另一个片段内的片段中。

视图寻呼机适配器是FragmentStatePagerAdapter

当寻呼机适配器保存状态时,它会调用android.support.v4.app.FragmentManager#saveFragmentInstanceState

从那里开始我们android.support.v4.app.FragmentManagerImpl#saveFragmentViewState,但是对ScrollView#saveHierarchyState的调用并没有像在新设备上那样将保存的状态添加到捆绑包中。具体来说,较新的设备会添加android.widget.HorizontalScrollView.SavedState的实例(无论如何,调试器会说的是,代码表明它是android.widget.ScrollView.SavedState,而较旧的API设备会添加android.view.AbsSavedState#EMPTY_STATE

void saveFragmentViewState(Fragment f) { //f is my fragment
    if (f.mInnerView == null) {
        return;
    }
    if (mStateArray == null) {
        mStateArray = new SparseArray<Parcelable>();
    } else {
        mStateArray.clear();
    }
    // f.mInnerView is a ScrollView
    f.mInnerView.saveHierarchyState(mStateArray); //should save state here 
    if (mStateArray.size() > 0) {
        f.mSavedViewState = mStateArray;
        mStateArray = null;
    }
}

进一步调查应该发生的事情导致android.widget.ScrollView#onSaveInstanceState实际上将滚动位置保存到android.widget.ScrollView.SavedState#scrollPosition

1 个答案:

答案 0 :(得分:0)

当我在Android API 23和19之间区分ScrollView.java时,我发现新版本确实添加了保存和恢复此状态的代码。

我发现支持库小部件NestedScrollView是最简单的解决方案,因为它可以正确保存滚动状态。正如链接文档所述,它实际上并不需要嵌套,因为同一个类可以是父类或嵌套子类。我需要做的一个重要更改是包含默认情况下由于某种原因而没有使用此类的滚动条。

<android.support.v4.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/my_scroller"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    style="@style/AppTheme"
    android:scrollbars="vertical"
    tools:context="com.example.myapplication.FragmentOne">