Cara menggulir ke bawah di ScrollView saat memulai aktivitas

96

Saya menampilkan beberapa data di ScrollView. Pada startup aktivitas (metode onCreate) saya mengisi ScrollView dengan data dan ingin menggulir ke bawah.

Saya mencoba menggunakan getScrollView().fullScroll(ScrollView.FOCUS_DOWN). Ini berfungsi ketika saya menjadikannya sebagai tindakan saat mengklik tombol tetapi tidak berfungsi dalam metode onCreate.

Apakah ada cara untuk menggulir ScrollView ke bawah saat memulai aktivitas? Artinya tampilan sudah digulir ke bawah saat pertama kali ditampilkan.

Palo
sumber
Ini juga menjelaskan mengapa saya mendapatkan 0 sepanjang waktu ketika saya mencoba menggunakan getMeasuredWidth saat menginisialisasi subkelas saya sendiri dari sebuah ScrollView.
Ghoti

Jawaban:

218

Itu perlu dilakukan sebagai berikut:

    getScrollView().post(new Runnable() {

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

Dengan cara ini tampilan pertama kali diperbarui dan kemudian bergulir ke bawah "baru".

Palo
sumber
1
Saya mencoba persis ini tetapi tampaknya tidak bekerja masih ... Anda menelepon kode di atas di onCreatesatu mengandung Activity?
pstanton
Saya melakukannya di onStart
Palo
4
Sebagai gantinya post () gunakan postDelayed () dengan penundaan 100ms. itu akan bekerja dari titik siklus hidup aktivitas apa pun.
Vitaliy A
50

Letakkan kode berikut setelah data Anda ditambahkan:

final ScrollView scrollview = ((ScrollView) findViewById(R.id.scrollview));
scrollview.post(new Runnable() {
    @Override
    public void run() {
        scrollview.fullScroll(ScrollView.FOCUS_DOWN);
    }
});
Harshid
sumber
4
Bagi saya ini hanya bekerja dengan postDelayed, bukan posting. Hanya penundaan 100 milidetik.
Andreas Rudolph
Sempurna. Tentu saja dengan kombo dengan scrollview.fullScroll (ScrollView.FOCUS_UP);
ieselisra
30

Ini bekerja untuk saya:

scrollview.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        scrollview.post(new Runnable() {
            public void run() {
                scrollview.fullScroll(View.FOCUS_DOWN);
            }
        });
    }
});
sonida
sumber
2
Jawaban terbaik untuk pertanyaan ini sejauh ini. Banyak pendekatan lain bersyarat tetapi yang ini luar biasa dan berfungsi dengan sangat baik :)
rana
17

Anda dapat melakukan ini di file layout:

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

Coba ini

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

Tepat setelah Anda menambahkan data ke tampilan, tambahkan satu baris ini:

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

Setelah menginisialisasi komponen UI Anda dan mengisinya dengan data. tambahkan baris tersebut ke metode pembuatan Anda

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

Ini adalah cara terbaik untuk melakukan ini.

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