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.


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


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

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

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

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

4

Coba ini

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

3

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

yourScrollview.fullScroll(ScrollView.FOCUS_DOWN);

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

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);
                }
            });
        }
});
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.