98 votes

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

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 les données jusqu'en bas.

J'ai essayé d'utiliser getScrollView().fullScroll(ScrollView.FOCUS_DOWN) . Cela fonctionne lorsque j'en fais une action au moment du clic sur le 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 est déjà défilée vers le bas lors du premier affichage.

0 votes

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

220voto

Palo Points 1898

Il faut procéder 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 jusqu'au "nouveau" fond.

1 votes

J'essaie exactement ceci mais cela ne semble pas fonctionner encore... appelez-vous le code ci-dessus en onCreate du contenant Activity ?

4 votes

Au lieu de post(), utilisez postDelayed() avec un délai de 100 ms. Cela fonctionnera à partir de n'importe quel point du cycle de vie de l'activité.

50voto

Harshid Points 2354

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

5 votes

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

0 votes

Parfait. Bien sûr, en combinant avec scrollview.fullScroll(ScrollView.FOCUS_UP) ;

31voto

sonida Points 1578

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 votes

La 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 :)

17voto

Tam Dao Points 159

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">

-4voto

jshrc Points 46

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

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