Eu sei que isso pode ser tarde demais para uma resposta melhor, mas a solução perfeita desejada deve ser um sistema como posicionador. Quero dizer, quando o sistema faz um posicionamento para um campo do Editor, ele coloca o campo apenas no teclado, de modo que as regras da UI / UX são perfeitas.
O que o código abaixo faz é a maneira como o Android se posiciona sem problemas. Primeiro, mantemos o ponto de rolagem atual como um ponto de referência. A segunda coisa é encontrar o melhor ponto de rolagem de posicionamento para um editor, para fazer isso, role para cima e solicite os campos do editor para que o componente ScrollView faça o melhor posicionamento. Gatcha! Nós aprendemos a melhor posição. Agora, o que faremos é rolar sem problemas do ponto anterior até o ponto que encontramos recentemente. Se desejar, você pode omitir a rolagem suave usando scrollTo em vez de smoothScrollTo apenas.
NOTA: O container principal ScrollView é um campo de membro chamado scrollViewSignup, porque meu exemplo foi uma tela de inscrição, como você pode descobrir muito.
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);
}
});
}
}
});
Se você deseja usar este bloco para todas as instâncias do EditText , integre-o rapidamente ao seu código de tela. Você pode simplesmente fazer uma travessia como abaixo. Para fazer isso, eu criei o OnFocusChangeListener principal como um campo de membro chamado focusChangeListenerToScrollEditor e chamei durante onCreate, conforme abaixo.
traverseEditTextChildren(scrollViewSignup, focusChangeListenerToScrollEditor);
E a implementação do método é como abaixo.
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);
}
}
}
Portanto, o que fizemos aqui é fazer com que todos os filhos da instância EditText chamem o ouvinte em foco.
Para chegar a essa solução, verifiquei todas as soluções aqui e criei uma nova solução para obter melhores resultados de UI / UX.
Muito obrigado a todas as outras respostas que me inspiraram muito.
the form may changed from user to user
mas você pode apenas usarmEditView.getTop();