So scrollen Sie beim Starten einer Aktivität in einer ScrollView nach unten

96

Ich zeige einige Daten in einer ScrollView an. Beim Start der Aktivität (Methode onCreate) fülle ich die ScrollView mit Daten und möchte nach unten scrollen.

Ich habe versucht zu benutzen getScrollView().fullScroll(ScrollView.FOCUS_DOWN). Dies funktioniert, wenn ich es als Aktion beim Klicken auf eine Schaltfläche mache, aber es funktioniert nicht in der onCreate-Methode.

Gibt es eine Möglichkeit, die ScrollView beim Start der Aktivität nach unten zu scrollen? Das heißt, die Ansicht wird bereits bei der ersten Anzeige nach unten gescrollt.

Palo
quelle
Dies erklärt auch, warum ich die ganze Zeit 0 bekam, als ich versuchte, getMeasuredWidth zu verwenden, während ich meine eigene Unterklasse einer ScrollView initialisierte.
Ghoti

Antworten:

218

Es muss wie folgt vorgegangen werden:

    getScrollView().post(new Runnable() {

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

Auf diese Weise wird die Ansicht zuerst aktualisiert und dann zum "neuen" Boden gescrollt.

Palo
quelle
1
Ich versuche genau das, aber es scheint immer noch nicht zu funktionieren ... rufst du den obigen Code in onCreateder Liste an Activity?
Pstanton
Ich mache es in onStart
Palo
4
Verwenden Sie stattdessen post () postDelayed () mit einer Verzögerung von 100 ms. Es funktioniert von jedem Aktivitäts-Lebenszykluspunkt aus.
Vitaliy A
50

Geben Sie den folgenden Code ein, nachdem Ihre Daten hinzugefügt wurden:

final ScrollView scrollview = ((ScrollView) findViewById(R.id.scrollview));
scrollview.post(new Runnable() {
    @Override
    public void run() {
        scrollview.fullScroll(ScrollView.FOCUS_DOWN);
    }
});
Harshid
quelle
4
Für mich funktionierte dies nur mit einem postDelayed anstelle von post. Nur 100 Millisekunden Verzögerung.
Andreas Rudolph
Perfekt. Natürlich mit Combo mit scrollview.fullScroll (ScrollView.FOCUS_UP);
ieselisra
30

Das funktioniert bei mir:

scrollview.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        scrollview.post(new Runnable() {
            public void run() {
                scrollview.fullScroll(View.FOCUS_DOWN);
            }
        });
    }
});
Sonida
quelle
2
Beste Antwort auf diese Frage bisher. Viele andere Ansätze sind bedingt, aber dieser ist fantastisch und funktioniert super gut :)
Rana
17

Sie können dies in der Layoutdatei tun:

                android:id="@+id/listViewContent"
                android:layout_width="wrap_content"
                android:layout_height="381dp" 
                android:stackFromBottom="true"
                android:transcriptMode="alwaysScroll">
Tam Dao
quelle
8
 scrollView.postDelayed(new Runnable() {
        @Override
        public void run() {
            scrollView.fullScroll(ScrollView.FOCUS_DOWN);
        }
    },1000);
Makvin
quelle
4

Versuche dies

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

Fügen Sie direkt nach dem Anhängen von Daten an die Ansicht diese einzelne Zeile hinzu:

yourScrollview.fullScroll(ScrollView.FOCUS_DOWN);
LEMUEL ADANE
quelle
1

Nachdem Sie Ihre UI-Komponente initialisiert und mit Daten gefüllt haben. Fügen Sie diese Zeile Ihrer On-Create-Methode hinzu

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

Dies ist der beste Weg, dies zu tun.

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