Comment faire défiler vers le bas dans un ScrollView au démarrage de l'activité


96

J'affiche des données dans un ScrollView. Au démarrage de l'activité (méthode onCreate), je remplis le ScrollView avec des données et je veux faire défiler vers le bas.

J'ai essayé d'utiliser getScrollView().fullScroll(ScrollView.FOCUS_DOWN). Cela fonctionne lorsque je le fais comme une action sur un clic sur un bouton, mais cela ne fonctionne pas dans la méthode onCreate.

Existe-t-il un moyen de faire défiler le ScrollView vers le bas au démarrage de l'activité? Cela signifie que la vue défile déjà vers le bas lors de son premier affichage.


Cela explique également pourquoi j'obtenais 0 tout le temps lorsque j'essayais d'utiliser getMeasuredWidth lors de l'initialisation de ma propre sous-classe d'un ScrollView.
Ghoti

Réponses:


218

Cela doit être fait comme suit:

    getScrollView().post(new Runnable() {

        @Override
        public void run() {
            getScrollView().fullScroll(ScrollView.FOCUS_DOWN);
        }
    });

De cette façon, la vue est d'abord mise à jour, puis défile vers le «nouveau» bas.


1
J'essaye exactement cela mais cela ne semble pas encore fonctionner ... appelez-vous le code ci-dessus dans onCreatele contenant Activity?
pstanton le

Je le fais dans onStart
Palo

4
À la place, post () utilise postDelayed () avec un délai de 100 ms. il fonctionnera à partir de n'importe quel point du cycle de vie de l'activité.
Vitaliy A

50

Mettez le code suivant après l'ajout de vos données:

final ScrollView scrollview = ((ScrollView) findViewById(R.id.scrollview));
scrollview.post(new Runnable() {
    @Override
    public void run() {
        scrollview.fullScroll(ScrollView.FOCUS_DOWN);
    }
});

4
Pour moi, cela ne fonctionnait qu'avec un postDelayed au lieu d'un post. Seulement 100 millisecondes de retard.
Andreas Rudolph

Parfait. Bien sûr avec combo avec scrollview.fullScroll (ScrollView.FOCUS_UP);
ieselisra

30

Cela fonctionne pour moi:

scrollview.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        scrollview.post(new Runnable() {
            public void run() {
                scrollview.fullScroll(View.FOCUS_DOWN);
            }
        });
    }
});

2
Meilleure réponse à cette question jusqu'à présent. Beaucoup d'autres approches sont conditionnelles mais celle-ci est géniale et fonctionne très bien :)
rana

17

Vous pouvez le faire dans le fichier de mise en page:

                android:id="@+id/listViewContent"
                android:layout_width="wrap_content"
                android:layout_height="381dp" 
                android:stackFromBottom="true"
                android:transcriptMode="alwaysScroll">

8
 scrollView.postDelayed(new Runnable() {
        @Override
        public void run() {
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        }
    },1000);

4

Essaye ça

    final ScrollView scrollview = ((ScrollView) findViewById(R.id.scrollview));
    scrollview.post(new Runnable() {
       @Override
       public void run() {
         scrollview.fullScroll(ScrollView.FOCUS_DOWN);
       }
    });

3

Juste après avoir ajouté des données à la vue, ajoutez cette seule ligne:

yourScrollview.fullScroll(ScrollView.FOCUS_DOWN);

1

Après avoir initialisé votre composant d'interface utilisateur et le remplir de données. ajoutez ces lignes à votre méthode on create

Runnable runnable=new Runnable() {
        @Override
        public void run() {
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        }
    };
    scrollView.post(runnable);

1

C'est la meilleure façon de procéder.

scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            scrollView.post(new Runnable() {
                @Override
                public void run() {
                    scrollView.fullScroll(View.FOCUS_DOWN);
                }
            });
        }
});
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.