Há muitas boas respostas aqui, mas quero apenas acrescentar uma coisa. Às vezes, você deseja rolar o ScrollView para uma visualização específica do layout, em vez de uma rolagem completa para cima ou para baixo.
Um exemplo simples: em um formulário de registro, se o usuário tocar no botão "Inscrição" quando um texto de edição do formulário não estiver preenchido, você deverá rolar para o texto de edição específico para informar ao usuário que ele deve preencher esse campo.
Nesse caso, você pode fazer algo assim:
scrollView.post(new Runnable() {
public void run() {
scrollView.scrollTo(0, editText.getBottom());
}
});
ou, se você desejar uma rolagem suave em vez de uma rolagem instantânea:
scrollView.post(new Runnable() {
public void run() {
scrollView.smoothScrollTo(0, editText.getBottom());
}
});
Obviamente, você pode usar qualquer tipo de visualização em vez de Editar texto. Observe que getBottom () retorna as coordenadas da vista com base em seu layout pai, portanto todas as vistas usadas no ScrollView devem ter apenas um pai (por exemplo, um Layout Linear).
Se você tem vários pais dentro do filho do ScrollView, a única solução que encontrei é chamar requestChildFocus na exibição pai:
editText.getParent().requestChildFocus(editText, editText);
mas, neste caso, você não pode ter uma rolagem suave.
Espero que esta resposta possa ajudar alguém com o mesmo problema.
mScrollView.post(new Runnable() { public void run() { mScrollView.fullScroll(View.FOCUS_DOWN); } });