前人未踏の領域へ Androidアプリ開発編

Androidアプリ開発に関する調査メモ置き場。古い記事にはアプリ以外も含まれます。

ScrollViewのスクロール位置の再現

注意

この記事は何らかの(失念)実装ミスをした際に発生した副作用に対する誤った解決策であり、
この処理が必要になるのは別なところに記述ミスがある可能性が高いと思う。
基本的に戻るボタンで戻った際にスクロール位置の再現が必要になることはないと思われる。

課題

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の情報が前回と同じにならないと正しくスクロールできないので注意。