Ich weiß, dass dies für eine bessere Antwort zu spät sein kann, aber eine gewünschte perfekte Lösung muss ein System wie ein Positionierer sein. Ich meine, wenn das System eine Position für ein Editor-Feld vornimmt, platziert es das Feld nur bis zur Tastatur, so dass es nach UI / UX-Regeln perfekt ist.
Was der folgende Code macht, ist die reibungslose Positionierung von Android. Zunächst behalten wir den aktuellen Bildlaufpunkt als Referenzpunkt bei. Zweitens müssen Sie den besten Positionierungs-Bildlaufpunkt für einen Editor finden. Dazu scrollen wir nach oben und fordern die Editorfelder auf, die ScrollView-Komponente so zu gestalten, dass sie die beste Positionierung ausführt. Gatcha! Wir haben die beste Position gelernt. Jetzt scrollen wir reibungslos vom vorherigen Punkt zu dem Punkt, den wir neu gefunden haben. Wenn Sie möchten, können Sie das reibungslose Scrollen unterlassen, indem Sie scrollTo anstelle vonoothScrollTo verwenden .
HINWEIS: Der Hauptcontainer ScrollView ist ein Mitgliedsfeld mit dem Namen scrollViewSignup, da mein Beispiel ein Anmeldebildschirm war, wie Sie vielleicht viel herausfinden.
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);
}
});
}
}
});
Wenn Sie diesen Block für alle EditText- Instanzen verwenden und ihn schnell in Ihren Bildschirmcode integrieren möchten . Sie können einfach einen Traverser wie unten erstellen. Zu diesem Zweck habe ich den OnFocusChangeListener-Hauptbereich zu einem Mitgliedsfeld mit dem Namen focusChangeListenerToScrollEditor gemacht und ihn während onCreate wie folgt aufgerufen.
traverseEditTextChildren(scrollViewSignup, focusChangeListenerToScrollEditor);
Und die Methodenimplementierung ist wie folgt.
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);
}
}
}
Wir haben hier also alle EditText-Instanzkinder dazu gebracht, den Listener im Fokus aufzurufen.
Um diese Lösung zu erreichen, habe ich alle Lösungen hier überprüft und eine neue Lösung für ein besseres UI / UX-Ergebnis generiert.
Vielen Dank an alle anderen Antworten, die mich sehr inspiriert haben.
the form may changed from user to user
aber Sie können nur verwendenmEditView.getTop();