Gostaria que um ScrollView iniciasse na parte inferior. Algum método?
android
android-scrollview
Noah Seidman
fonte
fonte
Respostas:
scroll.fullScroll(View.FOCUS_DOWN)
também deve funcionar.Coloque isso em um
scroll.Post(Runnable run)
Código Kotlin
fonte
você deve executar o código dentro do scroll.post assim:
fonte
scroll.scrollTo(0, scroll.getHeight());
para saltar para a parte inferior, ouscroll.smoothScrollTo(0, scroll.getHeight());
para uma rolagem mais suavescrollView.post { scrollView.fullScroll(View.FOCUS_DOWN) }
scroll.fullScroll(View.FOCUS_DOWN)
levará à mudança de foco. Isso trará algum comportamento estranho quando houver mais de uma exibição focalizável, por exemplo, dois EditText. Existe outro caminho para essa pergunta.Isso funciona bem.
Extensão Kotlin
fonte
Às vezes, scrollView.post não funciona
MAS se você usar scrollView.postDelayed, ele definitivamente funcionará
fonte
O que funcionou melhor para mim é
fonte
Eu incremento para funcionar perfeitamente.
Nota
Esta resposta é uma solução alternativa para versões realmente antigas do Android. Hoje o
postDelayed
bug não tem mais e você deve usá-lo.fonte
postDelayed
:)Eu tentei esse sucesso.
fonte
Quando a visualização ainda não está carregada, você não pode rolar. Você pode fazer isso mais tarde com uma chamada pós-sono ou de suspensão, conforme descrito acima, mas isso não é muito elegante.
É melhor planejar a rolagem e fazê-lo no próximo onLayout (). Exemplo de código aqui:
https://stackoverflow.com/a/10209457/1310343
fonte
Uma coisa a considerar é o que NÃO definir. Verifique se os controles filho, principalmente os controles EditText, não possuem a propriedade RequestFocus definida. Essa pode ser uma das últimas propriedades interpretadas no layout e substituirá as configurações de gravidade em seus pais (o layout ou o ScrollView).
fonte
Aqui estão algumas outras maneiras de rolar para baixo
Usando
Se você visualizar a rolagem já definida
Se sua visualização de rolagem não estiver concluída (por exemplo: você role para baixo no
onCreate
método Activity ...)fonte
Não é exatamente a resposta para a pergunta, mas eu precisava rolar para baixo assim que um EditText conseguisse o foco. No entanto, a resposta aceita faria com que o ET também perdesse o foco imediatamente (para o ScrollView, presumo).
Minha solução alternativa foi a seguinte:
fonte
Na verdade, eu achei que chamar fullScroll duas vezes faz o truque:
Pode ter algo a ver com a ativação do método post () logo após executar o primeiro deslocamento (sem êxito). Acho que esse comportamento ocorre após qualquer chamada de método anterior no myScrollView, para que você possa tentar substituir o primeiro método fullScroll () por qualquer outra coisa que possa ser relevante para você.
fonte
O uso de outra maneira legal de fazer isso com as corotinas Kotlin. A vantagem de usar uma corotina oposta a um manipulador com um executável (post / postDelayed) é que ele não aciona um encadeamento caro para executar uma ação atrasada.
É importante especificar o HandlerContext da corotina como interface do usuário; caso contrário, a ação atrasada poderá não ser chamada a partir do encadeamento da interface do usuário.
fonte
Nesse caso, estava usando apenas scroll.scrollTo (0, sc.getBottom ()) não funciona, use-o usando scroll.post
Exemplo:
fonte
Uma possível razão pela qual
scroll.fullScroll(View.FOCUS_DOWN)
talvez não funcione,.post()
é que a visão não é apresentada. Nesse caso View.doOnLayout () poderia ser uma opção melhor:Ou, algo mais elaborado para as almas corajosas: https://chris.banes.dev/2019/12/03/suspending-views/
fonte