Voici ma mise en page:
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.
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. :)
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>