Eu tenho uma atividade muito longa com um scrollview. É um formulário com vários campos que o usuário deve preencher. Eu tenho uma caixa de seleção no meio do formulário e, quando o usuário o verifica, quero rolar para uma parte específica da visualização. Existe alguma maneira de rolar para um objeto EditText (ou qualquer outro objeto de exibição) programaticamente?
Além disso, eu sei que isso é possível usando as cordas X e Y, mas quero evitar isso, pois o formulário pode ser alterado de usuário para usuário.
android
view
android-edittext
scrollview
programmatically-created
NotACleverMan
fonte
fonte
the form may changed from user to user
mas você pode apenas usarmEditView.getTop();
Respostas:
fonte
your_scrollview.post(...
A resposta do Sherif elKhatib pode ser bastante aprimorada, se você quiser rolar a exibição para o centro da exibição de rolagem . Esse método reutilizável rola a exibição suavemente para o centro visível de um HorizontalScrollView.
Para uma vertical
ScrollView
usofonte
Isto funciona bem para mim :
child - O filho deste ViewParent que deseja foco. Essa visualização conterá a visualização focada. Não é necessariamente a visão que realmente tem foco.
focado - A visão de um descendente de criança que realmente tem foco
fonte
Na minha opinião, a melhor maneira de rolar para um determinado retângulo é via
View.requestRectangleOnScreen(Rect, Boolean)
. Você deve chamá-View
lo para onde deseja rolar e passar um retângulo local que deseja que seja visível na tela. O segundo parâmetro deve serfalse
para rolagem suave etrue
rolagem imediata.fonte
scrollview.smoothScrollTo
não vai funcionar se a visão necessária é fora da tela, (tentou em emulador android com SDK versão 26)new Handler().post()
?Eu criei um pequeno método utilitário baseado em Resposta do WarrenFaith, esse código também leva em consideração se essa exibição já estiver visível na visualização de rolagem, sem a necessidade de rolagem.
fonte
scrollBounds
deveria ser o parâmetro para oscrollView.getHitRect
métodoVocê deve
TextView
focar sua solicitação:fonte
Meu EditText foi aninhado várias camadas dentro do meu ScrollView, que por si só não é a visualização raiz do layout. Como getTop () e getBottom () pareciam relatar as coordenadas dentro de sua exibição, eu calculei a distância da parte superior do ScrollView até a parte superior do EditText, percorrendo os pais do EditText.
fonte
Outra variação seria:
ou você pode usar o
post()
métodofonte
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.
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.
E a implementação do método é como abaixo.
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.
fonte
As respostas acima funcionarão bem se o ScrollView for o pai direto do ChildView. Se o seu ChildView estiver sendo agrupado em outro ViewGroup no ScrollView, ele causará um comportamento inesperado porque o View.getTop () obtém a posição em relação ao pai. Nesse caso, você precisa implementar isso:
fonte
referência: https://stackoverflow.com/a/6438240/2624806
A seguir funcionou muito melhor.
fonte
Acho que encontrei uma solução mais elegante e menos propensa a erros usando
Não há matemática envolvida e, ao contrário de outras soluções propostas, ele manipulará a rolagem correta tanto para cima quanto para baixo.
É uma boa idéia envolvê-lo
postDelayed
para torná-lo mais confiável, casoScrollView
esteja sendo alterado no momentofonte
Examinando o código fonte do Android, você pode descobrir que já existe uma função membro de
ScrollView
-scrollToChild(View)
- que faz exatamente o que é solicitado. Infelizmente, esta função está marcada por alguma razão obscuraprivate
. Com base nessa função, escrevi a seguinte função que encontra o primeiroScrollView
acima doView
especificado como parâmetro e o rola para que fique visível dentro doScrollView
:fonte
Minha solução é:
fonte
Respondendo do meu projeto prático.
fonte
No meu caso, não
EditText
é issogoogleMap
. E funciona com sucesso assim.fonte
Que: Existe uma maneira de rolar programaticamente uma exibição de rolagem para um edittext específico?
Resp: A exibição de rolagem aninhada na última posição da reciclagem adicionou dados de registro.
Existe uma maneira de rolar programaticamente uma exibição de rolagem para um texto de edição específico?
fonte
A seguir, é o que estou usando:
Isso obtém a quantidade de rolagem necessária para mostrar a parte inferior da visualização, incluindo qualquer margem na parte inferior da visualização.
fonte
Rolagem vertical, boa para formulários. A resposta é baseada na rolagem horizontal Ahmadalibaloch.
fonte
HorizontalScrollView
nesse método?Você pode usar
ObjectAnimator
assim:fonte
Com base na resposta de Sherif, o seguinte funcionou melhor no meu caso de uso. Mudanças notáveis são em
getTop()
vez degetBottom()
e emsmoothScrollTo()
vez descrollTo()
.fonte
Se scrlMain é seu NestedScrollView, use o seguinte,
fonte