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.


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.


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

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

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

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

4

Versuche dies

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

3

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

yourScrollview.fullScroll(ScrollView.FOCUS_DOWN);

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

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);
                }
            });
        }
});
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.