Come scorrere verso il basso in una ScrollView all'avvio dell'attività


96

Sto visualizzando alcuni dati in una ScrollView. All'avvio dell'attività (metodo onCreate) riempio ScrollView con i dati e desidero scorrere fino in fondo.

Ho provato a usare getScrollView().fullScroll(ScrollView.FOCUS_DOWN). Funziona quando lo eseguo come azione al clic del pulsante ma non funziona nel metodo onCreate.

C'è un modo per far scorrere il ScrollView verso il basso all'avvio dell'attività? Ciò significa che la visualizzazione è già scorrere verso il basso quando viene visualizzata per la prima volta.


Questo spiega anche perché stavo ottenendo 0 tutto il tempo quando stavo cercando di utilizzare getMeasuredWidth mentre inizializzavo la mia sottoclasse di ScrollView.
Ghoti

Risposte:


218

Deve essere fatto come segue:

    getScrollView().post(new Runnable() {

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

In questo modo la visualizzazione viene prima aggiornata e quindi scorre fino al "nuovo" fondo.


1
Sto provando esattamente questo ma non sembra funzionare ancora ... stai chiamando il codice sopra nel onCreatecontenitore Activity?
pstanton

Lo sto facendo in onStart
Palo

4
Invece post () usa postDelayed () con 100ms di ritardo. funzionerà da qualsiasi punto del ciclo di vita dell'attività.
Vitaliy A

50

Inserisci il codice seguente dopo aver aggiunto i tuoi dati:

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

4
Per me questo ha funzionato solo con un postDelayed invece di post. Solo 100 millisecondi di ritardo.
Andreas Rudolph

Perfetto. Ovviamente con combo con scrollview.fullScroll (ScrollView.FOCUS_UP);
ieselisra

30

Questo funziona per me:

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

2
La migliore risposta per questa domanda finora. Molti altri approcci sono condizionali, ma questo è fantastico e funziona benissimo :)
rana

17

Puoi farlo nel file di layout:

                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

Prova questo

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

3

Subito dopo aver aggiunto i dati alla vista, aggiungi questa singola riga:

yourScrollview.fullScroll(ScrollView.FOCUS_DOWN);

1

Dopo aver inizializzato il componente dell'interfaccia utente e riempirlo con i dati. aggiungi quelle linee al tuo metodo di creazione

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

1

Questo è il modo migliore per farlo.

scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            scrollView.post(new Runnable() {
                @Override
                public void run() {
                    scrollView.fullScroll(View.FOCUS_DOWN);
                }
            });
        }
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.