Tôi biết điều này có thể là quá muộn để có câu trả lời tốt hơn nhưng một giải pháp hoàn hảo mong muốn phải là một hệ thống như định vị. Ý tôi là, khi hệ thống tạo định vị cho trường Editor, nó đặt trường chỉ lên bàn phím, do đó, quy tắc UI / UX là hoàn hảo.
Những gì bên dưới mã làm cho là cách định vị Android trơn tru. Trước hết chúng tôi giữ điểm cuộn hiện tại làm điểm tham chiếu. Điều thứ hai là tìm điểm cuộn định vị tốt nhất cho trình soạn thảo, để thực hiện điều này, chúng tôi cuộn lên trên cùng, sau đó yêu cầu các trường soạn thảo tạo thành phần ScrollView để thực hiện định vị tốt nhất. Gatcha! Chúng tôi đã học được vị trí tốt nhất. Bây giờ, những gì chúng ta sẽ làm là cuộn trơn tru từ điểm trước đến điểm chúng ta mới tìm thấy. Nếu bạn muốn, bạn có thể bỏ qua việc cuộn trơn tru bằng cách sử dụng scrollTo thay vì smoothScrollTo .
LƯU Ý: ScrollView container chính là trường thành viên có tên scrollViewSignup, vì ví dụ của tôi là màn hình đăng ký, vì bạn có thể tìm ra rất nhiều.
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);
}
});
}
}
});
Nếu bạn muốn sử dụng khối này cho tất cả các phiên bản EditText và nhanh chóng tích hợp nó với mã màn hình của bạn. Bạn chỉ có thể thực hiện một traverser như dưới đây. Để làm điều này, tôi đã biến OnF FocusChangeListener chính thành một trường thành viên có tên là FocusChangeListenerToScrollEditor và gọi nó trong onCreate như dưới đây.
traverseEditTextChildren(scrollViewSignup, focusChangeListenerToScrollEditor);
Và phương pháp thực hiện như dưới đây.
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);
}
}
}
Vì vậy, những gì chúng tôi đã làm ở đây là làm cho tất cả trẻ em EditText gọi người nghe tập trung.
Để đạt được giải pháp này, tôi đã kiểm tra tất cả các giải pháp tại đây và tạo ra một giải pháp mới cho kết quả UI / UX tốt hơn.
Rất cám ơn tất cả các câu trả lời khác truyền cảm hứng cho tôi nhiều.
the form may changed from user to user
nhưng bạn chỉ có thể sử dụngmEditView.getTop();