44 votes

ScrollView .scrollTo ne fonctionne pas ? Sauvegarde de la position du ScrollView lors de la rotation

Ok... Je dois être en train de négliger quelque chose de très simple ici, mais je pense que j'essaie de faire quelque chose d'assez basique... Conserver simplement la position de la barre de défilement d'un ScrollView lors d'un changement d'orientation...

Voici le code de mes onSaveInstanceState et onRestoreInstanceState . sView est le conteneur pour le layout ScrollView. A l'intérieur de mon scrollview se trouve un linearlayout avec beaucoup de textviews.

    @Override 
public void onSaveInstanceState(Bundle outState) 
{
    //---save whatever you need to persist—

    outState.putInt("sViewX",sView.getScrollX());
    outState.putInt("sViewY",sView.getScrollY());

super.onSaveInstanceState(outState);

}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) 
{
    super.onRestoreInstanceState(savedInstanceState);

    sViewX = savedInstanceState.getInt("sViewX");   
    sViewY = savedInstanceState.getInt("sViewY");

    sView.scrollTo(sViewX, sViewY);

}

Si je place un Toast avec les valeurs de sViewX et sViewY lors de la restauration, les valeurs sont conservées et correctes.

Edit : Je viens d'essayer de faire un sView.scrollTo(0,150) ; dans mon onCreate juste pour voir si cela ouvrirait l'activité à 150px de profondeur, et ça n'a pas marché. Je pense que mon problème est lié à la méthode .scrollTo.

127voto

kefs Points 1286

J'ai compris.

Puisque j'utilise setText pour les TextViews dans mon onCreate, appeler .scrollTo ne fonctionnera pas.

J'utilise donc maintenant ce qui suit :

sView.post(new Runnable() {
    @Override
    public void run() {
        sView.scrollTo(sViewX, sViewY);
    } 
});

0voto

Pour MVVMCross :

protected override void OnSaveInstanceState(Bundle outState)
{
    base.OnSaveInstanceState(outState);

    ScrollView sv = FindViewById<ScrollView>(Resource.Id.dispatchScrollView);
    int posY = sv.ScrollY;

    outState.PutInt("scrollY", posY);
}

protected override void OnRestoreInstanceState(Bundle savedInstanceState)
{
    base.OnRestoreInstanceState(savedInstanceState);

    ScrollView sv = FindViewById<ScrollView>(Resource.Id.dispatchScrollView);
    int posY = savedInstanceState.GetInt("scrollY");

    sv.Post(new Runnable(new Action(() => sv.ScrollTo(0, posY))));
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X