Saya tahu ini mungkin sudah terlambat untuk jawaban yang lebih baik tetapi solusi sempurna yang diinginkan harus berupa sistem seperti positioner. Maksudku, ketika sistem membuat posisi untuk bidang Editor itu menempatkan bidang hanya ke keyboard, sehingga UI / UX aturan itu sempurna.
Apa yang membuat kode di bawah ini adalah cara penempatan Android dengan lancar. Pertama-tama kita menjaga titik gulir saat ini sebagai titik referensi. Hal kedua adalah menemukan titik gulir penentuan posisi terbaik untuk seorang editor, untuk melakukan ini kita gulir ke atas, dan kemudian meminta bidang editor untuk membuat komponen ScrollView untuk melakukan penentuan posisi terbaik. Gatcha! Kami telah mempelajari posisi terbaik. Sekarang, apa yang akan kita lakukan adalah menggulir dengan lancar dari titik sebelumnya ke titik yang baru kita temukan. Jika mau, Anda dapat menghilangkan pengguliran yang lancar dengan menggunakan scrollTo alih-alih smoothScrollTo saja.
CATATAN: Wadah utama ScrollView adalah bidang anggota bernama scrollViewSignup, karena contoh saya adalah layar pendaftaran, karena Anda mungkin sering tahu.
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);
}
});
}
}
});
Jika Anda ingin menggunakan blok ini untuk semua instance EditText , dan cepat mengintegrasikannya dengan kode layar Anda. Anda cukup membuat traverser seperti di bawah ini. Untuk melakukan ini, saya telah membuat OnFocusChangeListener utama bidang anggota bernama focusChangeListenerToScrollEditor , dan menyebutnya selama onCreate seperti di bawah ini.
traverseEditTextChildren(scrollViewSignup, focusChangeListenerToScrollEditor);
Dan implementasinya adalah sebagai berikut.
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);
}
}
}
Jadi, apa yang kami lakukan di sini adalah menjadikan semua anak contoh EditText untuk memanggil pendengar sebagai fokus.
Untuk mencapai solusi ini, saya telah memeriksanya semua solusi di sini, dan menghasilkan solusi baru untuk hasil UI / UX yang lebih baik.
Terima kasih banyak untuk semua jawaban lain yang menginspirasi saya.
the form may changed from user to user
tetapi Anda bisa menggunakanmEditView.getTop();