Como posso detectar um evento de tecla delete (backspace) para um editText? Eu tentei usar o TextWatcher, mas quando o editText está vazio, quando pressiono a tecla Delete, nada acontece. Eu quero detectar a tecla delete e pressionar um editText, mesmo que não tenha texto.
android
events
android-edittext
key
Buda Gavril
fonte
fonte
event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_DEL
se você não quiser evento ao fogo duas vezes por pressionar backspaceJá faz um tempo desde que você perguntou, mas eu só tive o mesmo problema. Como já mencionado por Estel, o problema com os principais ouvintes é que eles só funcionam com teclados de hardware. Para fazer isso com um IME (teclado virtual) , a solução é um pouco mais elaborada.
O método único que realmente queremos substituir está
sendKeyEvent
na classeEditText
'sInputConnection
. Este método é chamado quando os principais eventos ocorrem em um IME. Mas, para substituir isso, precisamos implementar um costumeEditText
que substitua oonCreateInputConnection
método, envolvendo oInputConnection
objeto padrão em uma classe proxy! : |Parece complicado, mas aqui está o exemplo mais simples que eu poderia inventar:
A linha com a chamada para
setRandomBackgroundColor
é onde minha ação especial de backspace ocorre. Nesse caso, alterando aEditText
cor de fundo do.Se você estiver inflando isso a partir do XML, lembre-se de usar o nome completo do pacote como a tag:
fonte
Esta é apenas uma adição à resposta de Idris, adicionando a substituição para deleteSurroundingText também. Encontrei mais informações sobre isso aqui: Android: Backspace no WebView / BaseInputConnection
fonte
deleteSurroundingText
era exatamente o que eu precisava depois de tentar inúmeras outras soluções.Aqui está minha solução fácil, que funciona para todas as APIs:
ATUALIZAÇÃO 17.04.18 .
Conforme indicado nos comentários, esta solução não rastreia a pressão de backspace se o EditText estiver vazio (o mesmo que a maioria das outras soluções).
No entanto, é suficiente para a maioria dos casos de uso.
PS Se eu tivesse que criar algo semelhante hoje, faria:
Em seguida, basta usá-lo como um TextWatcher comum:
fonte
Enviei 2 dias para encontrar uma solução e descobri uma que funcionava :) (em teclas de função)
Depois de adicionar o observador de texto ao seu EditText:
Espero que ele funcione em outros dispositivos Android também (Samsung, LG, etc).
fonte
Minha solução simples que funciona perfeitamente. Você deve adicionar uma bandeira. Meu trecho de código:
fonte
Exemplo de criação de EditText com TextWatcher
TextWatcher personalizado
fonte
para alguém que está usando Kotlin
addOnTextChanged
não é flexível o suficiente para lidar com alguns casos (por exemplo: detectar se o usuário pressiona excluir quando o texto de edição estava vazio)setOnkeyListener
trabalhou mesmo teclado virtual ou teclado! mas apenas em alguns dispositivos . No meu caso, ele funciona no Samsung s8, mas não no Xiaomi mi8 se.se você estiver usando o kotlin, poderá usar a função de linha cruzada
doOnTextChanged
, é a mesma coisa,addOnTextChanged
mas o retorno de chamada é acionado até a edição de texto estava vazia.NOTA: doOnTextChanged faz parte da biblioteca Android KTX
fonte
doOnTextChanged
função de extensão está acessível na biblioteca Android KTXEditText
? Agradecemos antecipadamenteHá uma pergunta semelhante no Stackoverflow. Você precisa substituir
EditText
para obter acesso aoInputConnection
objeto que contém odeleteSurroundingText
método Isso ajudará você a detectar o evento de exclusão (backspace). Por favor, dê uma olhada em uma solução que eu forneci lá Android - não é possível capturar backspace / delete press em soft. tecladofonte
Isso parece estar funcionando para mim:
fonte
Também estou enfrentando o mesmo problema no Dialog .. porque estou usando setOnKeyListener .. Mas defino o retorno padrão true. Após a alteração como no código abaixo, está funcionando bem para mim ..
fonte
Baseado em @Jiff
ZanyEditText
aqui éWiseEditText
comsetSoftKeyListener(OnKeyListener)
fonte
Meu problema era que eu tinha personalizado
Textwatcher
, então não queria adicionarOnKeyListener
a umEditText
e não queria criar personalizadoEditText
. Eu queria detectar se o backspace foi pressionado no meuafterTextChanged
método, para não acionar meu evento.Foi assim que resolvi isso. Espero que seja útil para alguém.
fonte
Testei a solução de Jeff na versão 4.2, 4.4, 6.0. Nos 4.2 e 6.0, funciona bem. Mas no 4.4, não funciona.
Encontrei uma maneira fácil de solucionar esse problema. O ponto principal é inserir um caractere invisível no conteúdo do EditText no início e não permitir que o usuário mova o cursor antes desse caractere. Minha maneira é inserir um caractere de espaço em branco com um ImageSpan de largura zero. Aqui está o meu código.
E precisamos customizar um EditText que tenha um SelectionChangeListener
}
E o ultimo passo
E agora estamos prontos ~ Podemos detectar o evento chave de backspace quando o EditText não possui conteúdo real e o usuário não sabe nada sobre o nosso truque.
fonte
Esta pergunta pode ser antiga, mas a resposta é realmente simples usando um TextWatcher.
fonte
Eu encontrei uma solução realmente simples que funciona com um teclado virtual.
fonte
Você pode definir um ouvinte de chave na atividade e, no método de retorno de chamada, pode detectar qual chave o usuário pressionou. O código abaixo é para sua referência. Espero que ajude.
fonte