So che potrebbe essere troppo tardi per una risposta migliore, ma una soluzione perfetta desiderata deve essere un sistema come il posizionatore. Voglio dire, quando il sistema effettua un posizionamento per un campo dell'editor, posiziona il campo fino alla tastiera, quindi come regola l'interfaccia utente / UX è perfetto.
Ciò che rende il codice seguente è il modo in cui Android si posiziona senza problemi. Innanzitutto manteniamo l'attuale punto di scorrimento come punto di riferimento. La seconda cosa è trovare il punto di scorrimento del posizionamento migliore per un editor, per fare ciò scorrere verso l'alto e quindi richiedere i campi dell'editor per fare in modo che il componente ScrollView esegua il posizionamento migliore. Gatcha! Abbiamo imparato la posizione migliore. Ora, quello che faremo è scorrere senza problemi dal punto precedente al punto che abbiamo trovato di nuovo. Se si vuole si può omettere Smooth scrolling utilizzando scrollTo invece smoothScrollTo solo.
NOTA: Il contenitore principale ScrollView è un campo membro chiamato scrollViewSignup, perché il mio esempio era una schermata di iscrizione, come puoi capire molto.
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);
}
});
}
}
});
Se si desidera utilizzare questo blocco per tutte le istanze di EditText e integrarlo rapidamente con il codice dello schermo. Puoi semplicemente fare un attraversatore come di seguito. Per fare questo, ho trasformato OnFocusChangeListener principale in un campo membro chiamato focusChangeListenerToScrollEditor e lo ho chiamato durante onCreate come di seguito.
traverseEditTextChildren(scrollViewSignup, focusChangeListenerToScrollEditor);
E l'implementazione del metodo è la seguente.
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);
}
}
}
Quindi, ciò che abbiamo fatto qui è fare in modo che tutti i figli dell'istanza EditText chiamino l'ascoltatore in primo piano.
Per raggiungere questa soluzione, ho verificato tutte le soluzioni qui e ho generato una nuova soluzione per un migliore risultato UI / UX.
Mille grazie a tutte le altre risposte che mi hanno ispirato molto.
the form may changed from user to user
ma puoi semplicemente usaremEditView.getTop();