Aquí hay muchas buenas respuestas, pero solo quiero agregar una cosa. A veces sucede que desea desplazar su ScrollView a una vista específica del diseño, en lugar de un desplazamiento completo hacia la parte superior o inferior.
Un ejemplo simple: en un formulario de registro, si el usuario toca el botón "Registrarse" cuando no se completa un texto de edición del formulario, desea desplazarse a ese texto de edición específico para indicarle al usuario que debe completar ese campo.
En ese caso, puedes hacer algo así:
scrollView.post(new Runnable() {
public void run() {
scrollView.scrollTo(0, editText.getBottom());
}
});
o, si desea un desplazamiento suave en lugar de un desplazamiento instantáneo:
scrollView.post(new Runnable() {
public void run() {
scrollView.smoothScrollTo(0, editText.getBottom());
}
});
Obviamente, puede usar cualquier tipo de vista en lugar de Editar texto. Tenga en cuenta que getBottom () devuelve las coordenadas de la vista en función de su diseño principal, por lo que todas las vistas utilizadas dentro de ScrollView deben tener solo un elemento primario (por ejemplo, un diseño lineal).
Si tiene varios padres dentro del hijo de ScrollView, la única solución que he encontrado es llamar a requestChildFocus en la vista padre:
editText.getParent().requestChildFocus(editText, editText);
pero en este caso no puede tener un desplazamiento suave.
Espero que esta respuesta pueda ayudar a alguien con el mismo problema.
mScrollView.post(new Runnable() { public void run() { mScrollView.fullScroll(View.FOCUS_DOWN); } });