注意
この記事は何らかの(失念)実装ミスをした際に発生した副作用に対する誤った解決策であり、
この処理が必要になるのは別なところに記述ミスがある可能性が高いと思う。
基本的に戻るボタンで戻った際にスクロール位置の再現が必要になることはないと思われる。
課題
Fragmentで画面遷移をしており、戻るボタンで戻った際にスクロール状態がクリアされてしまうのをなんとかしたい。
対応
スクロール位置を退避し、再セットする。
比較的最新バージョンであれば何もしなくても再現されるはずだが、古いバージョンのAndroidやSwipeRefreshLayoutと組み合わせると再現されなくなるらしく、対応が必要になる。
例
ScrollViewとスクロール位置を定義
private Scrollview mScrollView; private int mScrollY;
onDestroyViewでViewが破棄されるタイミングでスクロール位置を保持する。
@Override public void onDestroyView() { super.onDestroyView(); mScrollY = mScrollView.getScrollY(); }
onViewCreatedまたはonActivityCreatedでスクロール位置を戻す。setScrollYは14以降でないと利用できないのでscrollToで代用する。その場合、postしてタイミングを遅らせるのがポイント。
@Override public void onActivityCreated(Bundle savedInstanceState) { //TODO View状態の再現 //スクロール位置を戻す if (Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB_MR2) { mScrollView.setScrollY(mScrollY); } else { mScrollView.post(new Runnable() { @Override public void run() { mScrollView.scrollTo(0, mScrollY); } }); } }
事前にViewの情報が前回と同じにならないと正しくスクロールできないので注意。