webentwicklung-frage-antwort-db.com.de

Speichern Sie die Position der Bildlaufansicht, wenn sich die Ausrichtung ändert

Das ist mein Layout:

detail layout

Ich muss die Bildlaufposition speichern, wenn sich die Ausrichtung ändert. Wenn der Bildschirm beispielsweise im Hochformat für den Beginn des zweiten Namens steht, sollte er im Querformat beginnen.

14
user1945196

Um die Bildlaufposition eines ScrollView zu speichern und wiederherzustellen, wenn sich die Ausrichtung des Telefons ändert, können Sie Folgendes tun: Speichern Sie die aktuelle Position in der onSaveInstanceState-Methode:

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

Stellen Sie dann die Position in der onRestoreInstanceState-Methode wieder her. Beachten Sie, dass wir ein lauffähiges Element in der ScrollView veröffentlichen müssen, damit dies funktioniert:

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]);
            }
        });
}

Diese Lösung bei Google gefunden. Gutschrift geht an Original Coder. :) 

34
Umesh Chauhan

Legen Sie einfach Android: id in Ihrem Bildlaufelement fest. Ihre Ansicht speichert die Bildlaufposition automatisch.

Code aus 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);
        }
    }
}

Auf meinem Samsung-Tablet musste ich nicht so viel Code hinzufügen (nur den Anruf an die Superklasse). Ich hatte auch schon einen Namen in der 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