Je sais que cela peut être trop tard pour une meilleure réponse, mais une solution parfaite souhaitée doit être un système comme un positionneur. Je veux dire, quand le système fait un positionnement pour un champ Editor, il place le champ juste jusqu'au clavier, donc comme règles UI / UX, c'est parfait.
Ce que le code ci-dessous fait, c'est la façon dont Android se positionne en douceur. Tout d'abord, nous gardons le point de défilement actuel comme point de référence. La deuxième chose est de trouver le meilleur point de défilement de positionnement pour un éditeur, pour ce faire, nous faisons défiler vers le haut, puis demandons aux champs de l'éditeur de faire en sorte que le composant ScrollView fasse le meilleur positionnement. Gatcha! Nous avons appris la meilleure position. Maintenant, ce que nous allons faire, c'est faire défiler en douceur du point précédent au point que nous avons trouvé récemment. Si vous le souhaitez, vous pouvez omettre le défilement fluide en utilisant scrollTo au lieu de smoothScrollTo uniquement.
REMARQUE: le conteneur principal ScrollView est un champ membre nommé scrollViewSignup, car mon exemple était un écran d'inscription, comme vous pouvez le voir beaucoup.
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 vous souhaitez utiliser ce bloc pour toutes les instances EditText et l'intégrer rapidement à votre code d'écran. Vous pouvez simplement faire un traverseur comme ci-dessous. Pour ce faire, j'ai fait de OnFocusChangeListener un champ membre nommé focusChangeListenerToScrollEditor , et je l'ai appelé pendant onCreate comme ci-dessous.
traverseEditTextChildren(scrollViewSignup, focusChangeListenerToScrollEditor);
Et l'implémentation de la méthode est comme ci-dessous.
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);
}
}
}
Donc, ce que nous avons fait ici, c'est que tous les enfants de l'instance EditText appellent l'écouteur au focus.
Pour atteindre cette solution, j'ai vérifié toutes les solutions ici et généré une nouvelle solution pour un meilleur résultat UI / UX.
Merci beaucoup à toutes les autres réponses qui m'inspirent beaucoup.
the form may changed from user to user
mais vous pouvez simplement utilisermEditView.getTop();