Jest tu wiele dobrych odpowiedzi, ale chcę dodać tylko jedną rzecz. Czasami zdarza się, że chcesz przewinąć ScrollView do określonego widoku układu, zamiast pełnego przewijania do góry lub do dołu.
Prosty przykład: w formularzu rejestracyjnym, jeśli użytkownik dotknie przycisku „Zarejestruj się”, gdy tekst edycji formularza nie jest wypełniony, chcesz przewinąć do tego konkretnego tekstu edycji, aby poinformować użytkownika, że musi wypełnić to pole.
W takim przypadku możesz zrobić coś takiego:
scrollView.post(new Runnable() {
public void run() {
scrollView.scrollTo(0, editText.getBottom());
}
});
lub, jeśli chcesz płynne przewijanie zamiast natychmiastowego przewijania:
scrollView.post(new Runnable() {
public void run() {
scrollView.smoothScrollTo(0, editText.getBottom());
}
});
Oczywiście zamiast opcji Edytuj tekst można użyć dowolnego typu widoku. Zwróć uwagę, że getBottom () zwraca współrzędne widoku na podstawie jego układu nadrzędnego, więc wszystkie widoki używane wewnątrz ScrollView powinny mieć tylko element nadrzędny (na przykład układ liniowy).
Jeśli masz wielu rodziców wewnątrz elementu podrzędnego ScrollView, jedynym rozwiązaniem, które znalazłem, jest wywołanie requestChildFocus w widoku nadrzędnym:
editText.getParent().requestChildFocus(editText, editText);
ale w tym przypadku nie możesz mieć płynnego przewijania.
Mam nadzieję, że ta odpowiedź może pomóc komuś z tym samym problemem.
mScrollView.post(new Runnable() { public void run() { mScrollView.fullScroll(View.FOCUS_DOWN); } });