Я знаю, що це може бути пізно для кращої відповіді, але бажаним ідеальним рішенням повинна бути така система, як позиціонер. Я маю на увазі, коли система робить позиціонування для поля редактора, вона розміщує поле просто до клавіатури, так як правила 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 і швидко інтегрувати його з кодом екрану. Ви можете просто зробити траверса, як показано нижче. Для цього я зробив основний 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();