Здесь много хороших ответов, но я хочу добавить только одну вещь. Иногда случается, что вы хотите прокрутить ScrollView до определенного вида макета вместо полной прокрутки вверх или вниз.
Простой пример: если в форме регистрации пользователь нажимает кнопку «Регистрация», когда текст для редактирования формы не заполнен, вы хотите перейти к этому конкретному тексту для редактирования, чтобы сообщить пользователю, что он должен заполнить это поле.
В этом случае вы можете сделать что-то вроде этого:
scrollView.post(new Runnable() {
public void run() {
scrollView.scrollTo(0, editText.getBottom());
}
});
или, если вы хотите плавную прокрутку вместо мгновенной прокрутки:
scrollView.post(new Runnable() {
public void run() {
scrollView.smoothScrollTo(0, editText.getBottom());
}
});
Очевидно, что вы можете использовать любой тип представления вместо редактирования текста. Обратите внимание, что getBottom () возвращает координаты представления на основе его родительского макета, поэтому все представления, используемые внутри ScrollView, должны иметь только родителя (например, линейный макет).
Если у вас есть несколько родителей внутри дочернего элемента ScrollView, единственное решение, которое я нашел, это вызвать requestChildFocus в родительском представлении:
editText.getParent().requestChildFocus(editText, editText);
но в этом случае вы не можете иметь плавную прокрутку.
Я надеюсь, что этот ответ может помочь кому-то с той же проблемой.
mScrollView.post(new Runnable() { public void run() { mScrollView.fullScroll(View.FOCUS_DOWN); } });