Como colocar o cursor no final do texto do EditText: Kotlin para iniciantes

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Por que o cursor no EditText é uma dor de cabeça para iniciantes?

\n

Imagine: você está escrevendo um aplicativo de anotações ou chat. O usuário abre uma nota existente, começa a digitar — e de repente o novo texto é inserido no início ou no meio da linha. Situação familiar? Este é um daqueles problemas pequenos, mas extremamente irritantes, que todo mundo que começa a estudar desenvolvimento Android em Kotlin enfrenta.

\n

No Stack Overflow, a pergunta «Place cursor at the end of text in EditText» acumulou milhares de visualizações e dezenas de respostas. Por quê? Porque não existe uma maneira intuitiva de "apenas colocar o cursor no final" no Android SDK. É preciso conhecer alguns truques. Hoje vamos analisá-los de uma vez por todas — de forma simples, clara e com exemplos de código.

\n

A propósito, se você programa não apenas para Android, mas também, por exemplo, um backend em Python — no nosso site PythonLib você encontrará muitos materiais para começar. Mas hoje estamos falando sobre desenvolvimento mobile.

\n\n

Solução clássica: setSelection()

\n

A principal ferramenta para controlar o cursor no EditText é o método setSelection(). Ele recebe o índice da posição para onde o cursor deve ser movido. Mas para colocar o cursor bem no final, primeiro precisamos saber o comprimento do texto.

\n\n
// Maneira simples: pegar o comprimento do texto e passá-lo para setSelection\neditText.setText("Olá, mundo!")\neditText.setSelection(editText.text.length)
\n\n

É isso! editText.text.length retorna o número de caracteres. Passamos esse número para setSelection() — e o cursor vai para depois do último caractere.

\n\n

Mas há um detalhe: quando chamar?

\n

Iniciantes frequentemente escrevem este código logo após setText() — e se surpreendem que nada funciona. O problema é que o EditText pode ainda não ter tido tempo de ser atualizado. Isso é especialmente relevante se você está definindo o texto programaticamente em um fragmento ou activity.

\n

A melhor solução é usar post() ou o listener onTextChanged. Aqui está um exemplo com post() — isso garante que o código será executado depois que a View estiver pronta:

\n\n
editText.setText("Texto longo que precisa ser editado")\neditText.post {\n    editText.setSelection(editText.text.length)\n}
\n\n

Agora o cursor com certeza estará no final. Este método é o seu salvador em 90% dos casos.

\n\n

E se o texto muda dinamicamente?

\n

Suponha que você está escrevendo um campo de busca que sugere automaticamente. Ou um editor onde o usuário pode inserir modelos. Nessas situações, você precisa colocar o cursor no final toda vez que o texto muda programaticamente.

\n

Use TextWatcher ou, mais simplesmente, apenas chame setSelection() após cada alteração:

\n\n
fun appendText(newText: String) {\n    val currentText = editText.text.toString()\n    editText.setText(currentText + newText)\n    editText.setSelection(editText.text.length)\n}
\n\n

Este código primeiro adiciona o novo texto ao existente e, em seguida, move o cursor para o final. Funciona perfeitamente.

\n\n

Dica para experientes: Editable e Spannable

\n

Se você trabalha diretamente com Editable (por exemplo, obtendo-o de editText.text), pode usar SpannableStringBuilder e o método setSpan(). Mas para a tarefa básica de "cursor no final", isso é excessivo. Lembre-se: post { setSelection(length) } é a sua técnica básica.

\n\n

Por que isso não funciona em diálogos e fragmentos?

\n

Outra pergunta frequente no Stack Overflow. Se o seu EditText está dentro de um AlertDialog ou BottomSheetDialogFragment, o código pode não funcionar porque a View ainda não está anexada à janela.

\n

A solução é usar onResume() ou onWindowFocusChanged(). Em

Blogs

Book Recommendations