视图寻呼机上项目的滚动状态未在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
答案 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">