Bunun daha iyi bir cevap için çok geç olabileceğini biliyorum, ancak istenen mükemmel bir çözüm konumlandırıcı gibi bir sistem olmalı. Yani, sistem bir Editör alanı için bir konumlandırma yaptığında, alanı klavyeye kadar yerleştirir, böylece UI / UX kuralları mükemmeldir.
Kodun altında ne yapar Android yolu düzgün konumlandırma olduğunu. Her şeyden önce geçerli kaydırma noktasını referans noktası olarak tutarız. İkinci şey, bir düzenleyici için en iyi konumlandırma kaydırma noktasını bulmak, bunu yapmak için yukarı kaydırıyoruz ve daha sonra düzenleyici alanlarının ScrollView bileşenini en iyi konumlandırmayı yapmasını istemek. Gatcha! En iyi pozisyonu öğrendik. Şimdi yapacağımız şey, bir önceki noktadan yeni bulduğumuz noktaya sorunsuz bir şekilde ilerlemek. İsterseniz , yalnızca smoothScrollTo yerine scrollTo öğesini kullanarak düzgün kaydırmayı atlayabilirsiniz .
NOT: Ana kapsayıcı ScrollView, scrollViewSignup adlı bir üye alanıdır, çünkü örneğim çok fazla anlayabileceğiniz gibi bir kayıt ekranıdır.
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);
}
});
}
}
});
Bu bloğu tüm EditText örnekleri için kullanmak ve ekran kodunuzla hızlı bir şekilde entegre etmek istiyorsanız. Aşağıdaki gibi bir travers yapabilirsiniz. Bunu yapmak için, ana OnFocusChangeListener'ı focusChangeListenerToScrollEditor adlı bir üye alanı haline getirdim ve onCreate sırasında aşağıdaki gibi çağırın.
traverseEditTextChildren(scrollViewSignup, focusChangeListenerToScrollEditor);
Ve yöntem uygulaması aşağıdaki gibidir.
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);
}
}
}
Burada yaptığımız şey, tüm EditText örneği çocuklarını dinleyiciyi odakta aramalarıdır.
Bu çözüme ulaşmak için, burada tüm çözümleri kontrol ettim ve daha iyi UI / UX sonucu için yeni bir çözüm ürettim.
Bana ilham veren diğer tüm cevaplar için çok teşekkürler.
the form may changed from user to user
ama sadece kullanabilirsinizmEditView.getTop();