Android 从Fragment A切换到Fragment B,再返回到Fragment A,如何恢复离开A页面时的滑动位置?
我们的Fragment A中使用CoordinatorLayout
协调滚动,返回A时恢复滚动状态也很简单,只需要给CoordinatorLayout
的子视图(RecyclerView, AppBarLayout…)设置id即可。
Root Cause在CoordinatorLayout源码onSaveInstanceState方法:
protected Parcelable onSaveInstanceState() {
final SavedState ss = new SavedState(super.onSaveInstanceState());
final SparseArray<Parcelable> behaviorStates = new SparseArray<>();
for (int i = 0, count = getChildCount(); i < count; i++) {
final View child = getChildAt(i);
final int childId = child.getId();
final LayoutParams lp = (LayoutParams) child.getLayoutParams();
final Behavior b = lp.getBehavior();
// Root Cause Point
if (childId != NO_ID && b != null) {
// If the child has an ID and a Behavior, let it save some state...
Parcelable state = b.onSaveInstanceState(this, child);
if (state != null) {
behaviorStates.append(childId, state);
}
}
}
ss.behaviorStates = behaviorStates;
return ss;
}
切换页面destroy视图的时候只有设置了ID的子视图且behavior不为空才会保存子视图的状态, 以便在onRestoreInstanceState里恢复视图状态