Я знаю, что может быть слишком поздно для лучшего ответа, но желаемым идеальным решением должна быть система, подобная позиционеру. Я имею в виду, что когда система делает позиционирование для поля редактора, она помещает поле только на клавиатуре, так что, согласно правилам UI / UX, оно идеально.
То, что приведено ниже, делает способ позиционирования Android плавным. Прежде всего мы сохраняем текущую точку прокрутки в качестве контрольной точки. Во-вторых, чтобы найти лучшую точку прокрутки позиционирования для редактора, для этого мы прокручиваем вверх, а затем запрашиваем поля редактора, чтобы компонент ScrollView делал лучшее позиционирование. Гатча! Мы узнали лучшую позицию. Теперь то, что мы сделаем, - это плавная прокрутка от предыдущей точки до точки, которую мы нашли заново. Если вы хотите, вы можете пропустить плавную прокрутку, используя scrollTo вместо smoothScrollTo только.
ПРИМЕЧАНИЕ . Основным контейнером ScrollView является поле члена с именем scrollViewSignup, поскольку в моем примере был экран регистрации, как вы, возможно, многое поймете.
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);
}
});
}
}
});
Если вы хотите использовать этот блок для всех экземпляров EditText и быстро интегрировать его с вашим кодом экрана. Вы можете просто сделать traverser как ниже. Для этого я сделал основной OnFocusChangeListener полем-членом с именем focusChangeListenerToScrollEditor и вызывал его во время onCreate, как показано ниже.
traverseEditTextChildren(scrollViewSignup, focusChangeListenerToScrollEditor);
И реализация метода, как показано ниже.
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);
}
}
}
Итак, что мы сделали здесь, так это заставили всех дочерних экземпляров EditText вызывать слушателя в фокусе.
Чтобы найти это решение, я проверил здесь все решения и сгенерировал новое решение для лучшего результата UI / UX.
Большое спасибо всем остальным ответам, которые меня очень вдохновляют.
the form may changed from user to user
но вы можете просто использоватьmEditView.getTop();