Cách cuộn xuống dưới cùng trong ScrollView khi khởi động hoạt động


96

Tôi đang hiển thị một số dữ liệu trong ScrollView. Khi khởi động hoạt động (phương pháp onCreate), tôi điền dữ liệu vào ScrollView và muốn cuộn xuống dưới cùng.

Tôi đã cố gắng sử dụng getScrollView().fullScroll(ScrollView.FOCUS_DOWN). Điều này hoạt động khi tôi thực hiện nó như một hành động khi nhấp vào nút nhưng nó không hoạt động trong phương thức onCreate.

Có cách nào để cuộn ScrollView xuống dưới cùng khi khởi động hoạt động không? Điều đó có nghĩa là chế độ xem đã được cuộn xuống dưới cùng khi hiển thị lần đầu tiên.


Điều này cũng giải thích tại sao tôi luôn nhận được 0 khi tôi cố gắng sử dụng getMeasuredWidth trong khi khởi tạo lớp con ScrollView của riêng tôi.
Ghoti

Câu trả lời:


218

Nó cần được thực hiện như sau:

    getScrollView().post(new Runnable() {

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

Bằng cách này, chế độ xem được cập nhật lần đầu và sau đó cuộn xuống dưới cùng "mới".


1
Tôi đang thử chính xác điều này nhưng có vẻ như nó vẫn không hoạt động ... bạn đang gọi mã ở trên trong onCreatevùng chứa Activity?
pstanton,

Tôi đang làm điều đó trong OnStart
Palo

4
Thay vào đó, post () sử dụng postDelayed () với độ trễ 100ms. nó sẽ hoạt động từ bất kỳ điểm nào trong vòng đời của hoạt động.
Vitaliy A

50

Đặt mã sau khi dữ liệu của bạn được thêm vào:

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

4
Đối với tôi điều này chỉ hoạt động với một bài đăng Bị hoãn thay vì bài đăng. Chỉ chậm 100 mili giây.
Andreas Rudolph

Hoàn hảo. Tất nhiên với combo với scrollview.fullScroll (ScrollView.FOCUS_UP);
ieselisra

30

Điều này phù hợp với tôi:

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

2
Câu trả lời tốt nhất cho câu hỏi này cho đến nay. Rất nhiều cách tiếp cận khác là có điều kiện nhưng điều này là tuyệt vời n trình siêu mịn :)
rana

17

Bạn có thể thực hiện việc này trong tệp bố cục:

                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

Thử cái này

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

3

Ngay sau khi bạn nối dữ liệu vào dạng xem, hãy thêm dòng đơn này:

yourScrollview.fullScroll(ScrollView.FOCUS_DOWN);

1

Sau khi khởi tạo thành phần UI của bạn và điền vào nó với dữ liệu. thêm những dòng đó vào phương pháp on create của bạn

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

1

Đây là cách tốt nhất để làm điều này.

scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            scrollView.post(new Runnable() {
                @Override
                public void run() {
                    scrollView.fullScroll(View.FOCUS_DOWN);
                }
            });
        }
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.