ฉันรู้ว่านี่อาจจะสายเกินไปสำหรับคำตอบที่ดีกว่า แต่โซลูชันที่สมบูรณ์แบบที่ต้องการจะต้องเป็นระบบเช่นตัวกำหนดตำแหน่ง ฉันหมายถึงเมื่อระบบทำการกำหนดตำแหน่งสำหรับฟิลด์ตัวแก้ไขมันจะวางฟิลด์ไว้ใกล้กับคีย์บอร์ดดังนั้น UI / UX จึงเป็นกฎที่สมบูรณ์แบบ
สิ่งที่ทำให้โค้ดด้านล่างนี้คือตำแหน่งของ Android อย่างราบรื่น ก่อนอื่นเราให้จุดเลื่อนปัจจุบันเป็นจุดอ้างอิง สิ่งที่สองคือการหาจุดเลื่อนตำแหน่งที่ดีที่สุดสำหรับเครื่องมือแก้ไขการทำเช่นนี้เราเลื่อนไปด้านบนแล้วขอเขตข้อมูลเครื่องมือแก้ไขเพื่อให้องค์ประกอบ ScrollView ทำการวางตำแหน่งที่ดีที่สุด Gatcha! เราได้เรียนรู้ตำแหน่งที่ดีที่สุดแล้ว ตอนนี้สิ่งที่เราจะทำคือเลื่อนอย่างราบรื่นจากจุดก่อนหน้าไปยังจุดที่เราเพิ่งค้นพบใหม่ หากคุณต้องการคุณสามารถละเว้นการเลื่อนแบบราบรื่นโดยใช้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();