web-dev-qa-db-fra.com

Enregistrer la position de défilement lorsque l'orientation change

Voici ma mise en page:

detail layout

Je dois enregistrer la position de défilement lorsque l'orientation change. Par exemple, si l’écran affiche une mise en page commençant par le deuxième prénom en mode portrait, il doit en être de même en mode paysage.

14
user1945196

Pour enregistrer et restaurer la position de défilement d'un objet ScrollView lorsque l'orientation du téléphone change, vous pouvez procéder comme suit: Enregistrez la position actuelle dans la méthode onSaveInstanceState:

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

Puis restaurez la position dans la méthode onRestoreInstanceState. Notez que nous devons publier un fichier Runnable sur ScrollView pour que cela fonctionne:

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

Trouvé cette solution sur google. Le mérite revient à Original Coder. :) 

34
Umesh Chauhan

Il suffit de définir Android: id sur votre élément de défilement. Votre vue enregistrera automatiquement sa position de défilement.

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

Sur ma tablette Samsung, je n'ai pas eu à ajouter autant de code (juste l'appel à la super-classe). En outre, j'avais déjà un nom sur la liste.

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