Quero capturar um evento quando o usuário terminar de editar o EditText.
Como pode ser feito?
android
android-edittext
Eddyuk
fonte
fonte
override fun afterTextChanged(s: Editable?) { if (s.toString().length == 5) { val enteredString = s.toString() }
Respostas:
Quando o usuário terminar a edição, ele / ela irá pressionar
Done
ouEnter
fonte
Melhor forma, você também pode usar o ouvinte EditText onFocusChange para verificar se o usuário fez a edição: (não é necessário que o usuário pressione o botão Concluído ou Enter no teclado virtual)
Nota: Para mais de um EditText, você também pode deixar sua classe implementar, em
View.OnFocusChangeListener
seguida, definir os ouvintes para cada um de vocês EditText e validá-los conforme abaixofonte
EditText
. Nunca perderá o foco.EditText
? Eu tenho que usaronEditorAction
?EditText
, você valida tudo o que o usuário fizer para sair da tela.W/ViewRootImpl: Cancelling event due to no window focus: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=605.52246, y[0]=969.4336, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=238238, downTime=235422, deviceId=0, source=0x1002 }
recebia uma mensagem semelhante a esta: Mesmo que eu tenha digitado algo. Este é um texto de edição que aceita apenas números.Eu pessoalmente prefiro o envio automático após o fim da digitação. Veja como você pode detectar este evento.
Declarações e inicialização:
Ouvinte em, por exemplo, onCreate ()
Portanto, quando o texto é alterado, o cronômetro começa a aguardar as próximas alterações. Quando eles ocorrem, o temporizador é cancelado e reiniciado.
fonte
Handler
em vezVocê pode fazer isso usando setOnKeyListener ou usando um textWatcher como:
Definir observador de texto
editText.addTextChangedListener(textWatcher);
então ligue
fonte
Embora muitas respostas apontem na direção certa, acho que nenhuma delas responde o que o autor da pergunta estava pensando. Ou pelo menos entendi a pergunta de forma diferente porque estava procurando uma resposta para um problema semelhante. O problema é "Como saber quando o usuário para de digitar sem que ele pressione um botão" e acionar alguma ação (por exemplo, completar automaticamente). Se você quiser fazer isso, inicie o cronômetro em onTextChanged com um atraso que você consideraria que o usuário parou de digitar (por exemplo, 500-700ms), para cada nova letra ao iniciar o cronômetro cancele a anterior (ou pelo menos use algum tipo de sinalizar que, quando marcam, não fazem nada). Aqui está um código semelhante ao que usei:
Observe que eu modifico o sinalizador booleano em execução dentro da minha tarefa assíncrona (a tarefa obtém o json do servidor para preenchimento automático).
Também tenha em mente que isso cria muitas tarefas temporizadas (acho que elas estão agendadas no mesmo Tópico, mas você teria que verificar isso), então provavelmente há muitos lugares para melhorar, mas essa abordagem também funciona e o resultado final é que você deve use um cronômetro, pois não há nenhum "evento de usuário parou de digitar"
fonte
@Reno e @Vinayak B respondem juntos se você quiser ocultar o teclado após a ação
fonte
Uma abordagem diferente ... aqui está um exemplo: Se o usuário tem um atraso de 600-1000ms quando está digitando, você pode considerar que ele está parado.
fonte
Ok, isso vai funcionar 100% com certeza.
Primeiro, você precisará configurar o ouvinte se o teclado for mostrar ou ocultar. Se o teclado estiver aparecendo, provavelmente o usuário está digitando, caso contrário, termine de digitar.
fonte
heightDiff > 100
material é assustador imho.Eu resolvi esse problema dessa forma. Eu usei o kotlin.
fonte
Eu tive o mesmo problema e não queria contar com o usuário pressionando Concluído ou Enter.
Minha primeira tentativa foi usar o ouvinte onFocusChange, mas ocorreu que meu EditText obteve o foco por padrão. Quando o usuário pressionou alguma outra visualização, o onFocusChange foi acionado sem que o usuário nunca tivesse atribuído o foco.
A próxima solução fez isso para mim, em que onFocusChange é anexado se o usuário tocou em EditText:
No meu caso, quando o usuário terminou a edição, a tela foi renderizada novamente, renovando assim o objeto myEditText. Se o mesmo objeto for mantido, você provavelmente deve remover o ouvinte onFocusChange em onFocusChange para evitar o problema de onFocusChange descrito no início desta postagem.
fonte
Eu tive o mesmo problema ao tentar implementar 'agora digitando' no aplicativo de bate-papo. tente estender EditText da seguinte maneira:
}
fonte
Eu terminei ela com o mesmo problema e não consegui usar a solução com onEditorAction ou onFocusChange e não queria tentar o cronômetro. Um cronômetro é muito perigoso para gosto, por causa de todos os threads e muito imprevisível, já que você não sabe quando seu código é executado.
O onEditorAction não detecta quando o usuário sai sem usar um botão e, se você usá-lo, observe que KeyEvent pode ser nulo. O foco não é confiável em ambas as extremidades, o usuário pode obter o foco e sair sem inserir nenhum texto ou selecionar o campo e o usuário não precisa sair do último campo EditText.
Minha solução usa onFocusChange e um sinalizador definido quando o usuário começa a editar o texto e uma função para obter o texto da última visualização em foco, que chamo quando necessário.
Eu apenas limpo o foco em todos os meus campos de texto para enganar o código de exibição de texto de saída. O código clearFocus só é executado se o campo tiver foco. Eu chamo a função em onSaveInstanceState para que não precise salvar o sinalizador (mEditing) como um estado da visualização EditText e quando botões importantes são clicados e quando a atividade é fechada.
Tenha cuidado com o TexWatcher, pois ele é chamado frequentemente. Eu uso a condição em foco para não reagir quando o código onRestoreInstanceState insere texto. Eu
fonte
Eu fiz algo como esta classe abstrata que pode ser usada no lugar do tipo TextView.OnEditorActionListener.
fonte
Simples de acionar, terminar de digitar em EditText
funcionou para mim, se você estiver usando java, convertê-lo
Em Kotlin
fonte