2010-07-22 28 views
85

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

Tôi đã cố sử dụng getScrollView().fullScroll(ScrollView.FOCUS_DOWN). Điều này làm việc khi tôi làm cho nó như là một hành động trên nút bấm 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 lần đầu tiên được hiển thị.

+0

này cũng giải thích lý do tại sao tôi đã nhận được 0 tất cả các thời gian khi tôi đã cố gắng sử dụng getMeasuredWidth khi initialising lớp con riêng của tôi về một scrollview. – Ghoti

Trả lời

196

Nó cần phải đượ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, xem được cập nhật đầu tiên và sau đó cuộn xuống đáy "mới".

+1

Tôi đang cố gắng chính xác điều này nhưng nó dường như không hoạt động ... bạn đang gọi mã trên trong 'onCreate' của' Activity' có chứa? – pstanton

+0

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

+3

Thay vào đó hãy đăng() sử dụng postDelayed() với độ trễ 100ms. nó sẽ hoạt động từ bất kỳ điểm vòng đời nào của hoạt động. –

15

Bạn có thể làm điều này trong file layout:

   android:id="@+id/listViewContent" 
       android:layout_width="wrap_content" 
       android:layout_height="381dp" 
       android:stackFromBottom="true" 
       android:transcriptMode="alwaysScroll"> 
+0

Điều này thực sự làm việc cho tôi! Đạo cụ! –

+0

Tuyệt vời! :) –

+8

Điều này chỉ hoạt động nếu chế độ xem cuộn của bạn là chế độ xem danh sách. –

42

Đặt đoạn mã sau 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); 
    } 
}); 
+3

Đối với tôi, điều này chỉ hoạt động với một postDelayed thay vì đăng bài. Chỉ mất 100 mili giây. –

+0

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

25

này làm việc cho tôi:

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

Tuyệt vời. Cảm ơn. – Proverbio

+1

Câu trả lời hay 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 hoạt động siêu tốt :) – rana

3

Ngay sau bạn thêm dữ liệu vào chế độ xem để thêm dòng này:

yourScrollview.fullScroll(ScrollView.FOCUS_DOWN); 
+0

làm việc cho tôi :) – Smaran

3

Hãy thử điều này

final ScrollView scrollview = ((ScrollView) findViewById(R.id.scrollview)); 
    scrollview.post(new Runnable() { 
     @Override 
     public void run() { 
     scrollview.fullScroll(ScrollView.FOCUS_DOWN); 
     } 
    }); 
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() { 
         public void run() { 
          scrollView.fullScroll(View.FOCUS_DOWN); 

         } 
        }); 
       } 
1

Sau khi khởi tạo thành phần giao diện người dùng và điền dữ liệu vào. thêm những dòng trên của bạn tạo ra phương pháp

Runnable runnable=new Runnable() { 
     @Override 
     public void run() { 
      scrollView.fullScroll(ScrollView.FOCUS_DOWN); 
     } 
    }; 
    scrollView.post(runnable); 
0
scrollView.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      scrollView.fullScroll(ScrollView.FOCUS_DOWN); 
     } 
    },1000); 
Các vấn đề liên quan