web-dev-qa-db-ja.com

向きが変わったときにスクロールビューの位置を保存する

これらは私のレイアウトです:

detail layout

向きが変わったときにスクロール位置を保存する必要があります。たとえば、画面に縦長モードでミドルネームから始まるレイアウトが表示されている場合、横長モードでは同じ名前から開始する必要があります。

17
user1945196

スクロール要素にAndroid:idを設定するだけです。ビューはスクロール位置を自動的に保存します。

View.Java:15554からのコード

protected void dispatchSaveInstanceState(SparseArray<Parcelable> container) {
    if (mID != NO_ID && (mViewFlags & SAVE_DISABLED_MASK) == 0) {
        mPrivateFlags &= ~PFLAG_SAVE_STATE_CALLED;
        Parcelable state = onSaveInstanceState();
        if ((mPrivateFlags & PFLAG_SAVE_STATE_CALLED) == 0) {
            throw new IllegalStateException(
                    "Derived class did not call super.onSaveInstanceState()");
        }
        if (state != null) {
            // Log.i("View", "Freezing #" + Integer.toHexString(mID)
            // + ": " + state);
            container.put(mID, state);
        }
    }
}

電話の向きが変わったときにScrollViewのスクロール位置を保存して復元するには、次のようにします。現在の位置をonSaveInstanceStateメソッドに保存します。

protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putIntArray("ARTICLE_SCROLL_POSITION",
            new int[]{ mScrollView.getScrollX(), mScrollView.getScrollY()});
}

次に、onRestoreInstanceStateメソッドで位置を復元します。これを機能させるには、RunnableをScrollViewにポストする必要があることに注意してください。

protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    final int[] position = savedInstanceState.getIntArray("ARTICLE_SCROLL_POSITION");
    if(position != null)
        mScrollView.post(new Runnable() {
            public void run() {
                mScrollView.scrollTo(position[0], position[1]);
            }
        });
}

グーグルでこのソリューションを見つけました。クレジットは元のコーダーに送られます。 :)

38
Umesh Chauhan

Samsungタブレットでは、それほど多くのコードを追加する必要はありませんでした(スーパークラスの呼び出しだけ)。また、ListViewにはすでに名前がありました。

protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
}

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <EditText
        Android:id="@+id/search_text"
        Android:maxLines="1"
        Android:inputType="text"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:hint="Enter search string here" />

    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:onClick="doSearch"
        Android:clickable="true"
        Android:text="Search"
        Android:layout_toRightOf="@id/search_text"/>

    <ListView xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:id="@+id/list_of_books"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:layout_below="@id/search_text"
        Android:divider="@null"
        Android:orientation="vertical" />

</RelativeLayout>
0
Ed Poor