Sé que esto puede ser demasiado tarde para una mejor respuesta, pero una solución perfecta deseada debe ser un sistema como el posicionador. Quiero decir, cuando el sistema hace un posicionamiento para un campo Editor, coloca el campo justo encima del teclado, por lo que, como reglas UI / UX, es perfecto.
Lo que se muestra a continuación en el código es el posicionamiento de Android sin problemas. En primer lugar, mantenemos el punto de desplazamiento actual como punto de referencia. Lo segundo es encontrar el mejor punto de desplazamiento de posicionamiento para un editor, para hacer esto nos desplazamos hacia arriba, y luego solicitamos los campos del editor para que el componente ScrollView haga el mejor posicionamiento. Gatcha! Hemos aprendido la mejor posición. Ahora, lo que haremos es desplazarnos suavemente desde el punto anterior al punto que hemos encontrado recientemente. Si lo desea, puede omitir el desplazamiento suave utilizando scrollTo en lugar de smoothScrollTo solamente.
NOTA: El contenedor principal ScrollView es un campo miembro llamado scrollViewSignup, porque mi ejemplo era una pantalla de registro, ya que puede descubrir muchas cosas.
view.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(final View view, boolean b) {
if (b) {
scrollViewSignup.post(new Runnable() {
@Override
public void run() {
int scrollY = scrollViewSignup.getScrollY();
scrollViewSignup.scrollTo(0, 0);
final Rect rect = new Rect(0, 0, view.getWidth(), view.getHeight());
view.requestRectangleOnScreen(rect, true);
int new_scrollY = scrollViewSignup.getScrollY();
scrollViewSignup.scrollTo(0, scrollY);
scrollViewSignup.smoothScrollTo(0, new_scrollY);
}
});
}
}
});
Si desea utilizar este bloque para todas las instancias de EditText e integrarlo rápidamente con su código de pantalla. Simplemente puede hacer un recorrido como a continuación. Para hacer esto, hice que el OnFocusChangeListener principal sea un campo miembro llamado focusChangeListenerToScrollEditor , y lo llamo durante onCreate como se muestra a continuación.
traverseEditTextChildren(scrollViewSignup, focusChangeListenerToScrollEditor);
Y la implementación del método es la siguiente.
private void traverseEditTextChildren(ViewGroup viewGroup, View.OnFocusChangeListener focusChangeListenerToScrollEditor) {
int childCount = viewGroup.getChildCount();
for (int i = 0; i < childCount; i++) {
View view = viewGroup.getChildAt(i);
if (view instanceof EditText)
{
((EditText) view).setOnFocusChangeListener(focusChangeListenerToScrollEditor);
}
else if (view instanceof ViewGroup)
{
traverseEditTextChildren((ViewGroup) view, focusChangeListenerToScrollEditor);
}
}
}
Entonces, lo que hemos hecho aquí es hacer que todos los niños de la instancia de EditText llamen al oyente en foco.
Para llegar a esta solución, revisé todas las soluciones aquí y generé una nueva solución para un mejor resultado UI / UX.
Muchas gracias a todas las otras respuestas que me inspiraron mucho.
the form may changed from user to user
pero puedes usarlomEditView.getTop();