2010-07-22 6 views
85

Я показываю некоторые данные в ScrollView. При запуске активности (метод onCreate) я заполняю ScrollView данными и хочу прокрутить вниз.Как прокрутить вниз в ScrollView при запуске активности

Я попытался использовать getScrollView().fullScroll(ScrollView.FOCUS_DOWN). Это работает, когда я делаю это как действие при нажатии кнопки, но он не работает в методе onCreate.

Есть ли способ прокрутки ScrollView в нижней части запуска активности? Это означает, что при первом просмотре изображение уже прокручивается вниз.

+0

Это также объясняет, почему я получаю 0 все время, когда я пытался использовать getMeasuredWidth в то время как инициализацию моего собственного подкласса ScrollView. – Ghoti

ответ

196

Это должно быть сделано следующим образом:

getScrollView().post(new Runnable() { 

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

Таким образом, вид сначала обновляется и затем прокручивается к «новой» внизу.

+1

Я пытаюсь именно это, но он, похоже, не работает ... вы вызываете вышеуказанный код в 'onCreate' из содержащего' Activity'? – pstanton

+0

Я делаю это в onStart – Palo

+3

Вместо post() используйте postDelayed() с задержкой 100 мс. он будет работать из любой точки жизненного цикла. –

15

Вы можете сделать это в файле макет:

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

Это действительно сработало для меня! Реквизит! –

+0

Отлично! :) –

+8

Это работает, только если ваш вид прокрутки является списком. –

42

Поместите следующий код после добавления ваших данных:

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

Для меня это работало только с postDelayed вместо сообщения. Всего 100 миллисекунд задержки. –

+0

Отлично. Конечно, с комбо с scrollview.fullScroll (ScrollView.FOCUS_UP); – KNU

25

Это работает для меня:

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

Удивительный. Благодарю. – Proverbio

+1

Лучший ответ на этот вопрос. Множество других подходов условно, но этот потрясающий n работает супер отлично :) – rana

3

Сразу после вы добавляете данные в представление, добавьте эту одну строку:

yourScrollview.fullScroll(ScrollView.FOCUS_DOWN); 
+0

работал для меня :) – Smaran

3

Попробуйте

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

Это самый лучший способ сделать это.

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

         } 
        }); 
       } 
1

После инициализации компонента пользовательского интерфейса и заполнения его данными. добавить эти строки в вашу кнопку Создать метод

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); 
Смежные вопросы