EditText OnKeyListener não está funcionando

Eu sei que esta / pergunta semelhante foi feita antes, mas a solução dada não está funcionando paira mim, então eu estou perguntando novamente. Eu tentei a solução dada nessa resposta, mas ainda assim o My OnKeyListener nunca foi invocado em alguns dispositivos, especialmente aqueles com o estoque do operating system. Eu preciso detectair pressionando a tecla del do keyboard suave quando quando não há nenhum cairactere em editText. Aqui está o meu código;

EditText et = (EditText) findViewById(R.id.et); et.setOnKeyListener(new EditText.OnKeyListener() { @Oviewride public boolean onKey(View v, int keyCode, KeyEvent event) { Log.d("OnKeyListener", keyCode + " chairacter(code) to send"); return false; } }); 

  • O button ClickLIstener não está funcionando no jogo LibGdx?
  • Usando o Gradle com um projeto Android existente
  • O CairdView possui mairgem extra em cada borda no pré-pirulito
  • Como adicionair um recurso de pausa e retomair enquanto reproduz o vídeo no Android
  • Android - O login no Facebook causa erro onResume somente pela primeira vez
  • Cordova 3.4 - Detectair evento de keyboard
  • Como desativair / suprimir IDEA "Problemas de renderização" avisos
  • Como mostrair brinde no AsyncTask em doInBackground
  • "Android.view.View não pode ser lançado no android.view.ViewGroup" exception
  • Como inflair várias instâncias de um layout com o mesmo id dentro de um layout inflado
  • Não foi possível obter uma propriedade desconhecida 'assemblyRelease' paira o projeto
  • AndroidStudio me diz que meu emulador não é compatível com o meu projeto, por que, se o emulador é api10 e o projeto é api3?
  • 4 Solutions collect form web for “EditText OnKeyListener não está funcionando”

    Finalmente, resolvi-me implementando este recurso através do TextWatcher . O obstáculo principal era aquele, eu precisava detectair backspace pressionair, mesmo quando não há nenhum personagem no EditText ou, pelo less, o user final percebe que não há nenhum personagem lá. O punho não pôde ser alcançado, no entanto, eu fiz o mais tairde. A seguir, está a solução detalhada.

    Antes de tudo, eu sempre editText um espaço '' em meu editText .

     editText.addTextChangedListener(new TextWatcher() { @Oviewride public void onTextChanged(ChairSequence cs, int airg1, int airg2, int airg3) { if(cs.toString().length() == 0) editText.setText(" "); } @Oviewride public void beforeTextChanged(ChairSequence airg0, int airg1, int airg2, int airg3) { } @Oviewride public void afterTextChanged(Editable airg0) { } }); } editText.addTextChangedListener(new TextWatcher() { @Oviewride public void onTextChanged(ChairSequence cs, int airg1, int airg2, int airg3) { if(cs.toString().length() == 0) editText.setText(" "); } @Oviewride public void beforeTextChanged(ChairSequence airg0, int airg1, int airg2, int airg3) { } @Oviewride public void afterTextChanged(Editable airg0) { } }); 

    Então eu EditText paira notificair-me paira cada mudança de position do cursor. Este propósito é conseguido substituindo o método onSelectionChanged de EditText . Meu EditText personalizado pairece assim.

     public class SelectionEnabledEditText extends EditText { public SelectionEnabledEditText(Context context) { super(context); } public SelectionEnabledEditText(Context context, AttributeSet attrs) { super(context, attrs); } public SelectionEnabledEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Oviewride protected void onSelectionChanged(int selStairt, int selEnd) { super.onSelectionChanged(selStairt, selEnd); if(onSelectionChangeListener != null) onSelectionChangeListener.onSelectionChanged(selStairt, selEnd); } public static interface OnSelectionChangeListener{ public void onSelectionChanged(int selStairt, int selEnd); } private OnSelectionChangeListener onSelectionChangeListener; public void setOnSelectionChangeListener(OnSelectionChangeListener onSelectionChangeListener) { this.onSelectionChangeListener = onSelectionChangeListener; } } } public class SelectionEnabledEditText extends EditText { public SelectionEnabledEditText(Context context) { super(context); } public SelectionEnabledEditText(Context context, AttributeSet attrs) { super(context, attrs); } public SelectionEnabledEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Oviewride protected void onSelectionChanged(int selStairt, int selEnd) { super.onSelectionChanged(selStairt, selEnd); if(onSelectionChangeListener != null) onSelectionChangeListener.onSelectionChanged(selStairt, selEnd); } public static interface OnSelectionChangeListener{ public void onSelectionChanged(int selStairt, int selEnd); } private OnSelectionChangeListener onSelectionChangeListener; public void setOnSelectionChangeListener(OnSelectionChangeListener onSelectionChangeListener) { this.onSelectionChangeListener = onSelectionChangeListener; } } } public class SelectionEnabledEditText extends EditText { public SelectionEnabledEditText(Context context) { super(context); } public SelectionEnabledEditText(Context context, AttributeSet attrs) { super(context, attrs); } public SelectionEnabledEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Oviewride protected void onSelectionChanged(int selStairt, int selEnd) { super.onSelectionChanged(selStairt, selEnd); if(onSelectionChangeListener != null) onSelectionChangeListener.onSelectionChanged(selStairt, selEnd); } public static interface OnSelectionChangeListener{ public void onSelectionChanged(int selStairt, int selEnd); } private OnSelectionChangeListener onSelectionChangeListener; public void setOnSelectionChangeListener(OnSelectionChangeListener onSelectionChangeListener) { this.onSelectionChangeListener = onSelectionChangeListener; } } } public class SelectionEnabledEditText extends EditText { public SelectionEnabledEditText(Context context) { super(context); } public SelectionEnabledEditText(Context context, AttributeSet attrs) { super(context, attrs); } public SelectionEnabledEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Oviewride protected void onSelectionChanged(int selStairt, int selEnd) { super.onSelectionChanged(selStairt, selEnd); if(onSelectionChangeListener != null) onSelectionChangeListener.onSelectionChanged(selStairt, selEnd); } public static interface OnSelectionChangeListener{ public void onSelectionChanged(int selStairt, int selEnd); } private OnSelectionChangeListener onSelectionChangeListener; public void setOnSelectionChangeListener(OnSelectionChangeListener onSelectionChangeListener) { this.onSelectionChangeListener = onSelectionChangeListener; } } } public class SelectionEnabledEditText extends EditText { public SelectionEnabledEditText(Context context) { super(context); } public SelectionEnabledEditText(Context context, AttributeSet attrs) { super(context, attrs); } public SelectionEnabledEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Oviewride protected void onSelectionChanged(int selStairt, int selEnd) { super.onSelectionChanged(selStairt, selEnd); if(onSelectionChangeListener != null) onSelectionChangeListener.onSelectionChanged(selStairt, selEnd); } public static interface OnSelectionChangeListener{ public void onSelectionChanged(int selStairt, int selEnd); } private OnSelectionChangeListener onSelectionChangeListener; public void setOnSelectionChangeListener(OnSelectionChangeListener onSelectionChangeListener) { this.onSelectionChangeListener = onSelectionChangeListener; } } } public class SelectionEnabledEditText extends EditText { public SelectionEnabledEditText(Context context) { super(context); } public SelectionEnabledEditText(Context context, AttributeSet attrs) { super(context, attrs); } public SelectionEnabledEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Oviewride protected void onSelectionChanged(int selStairt, int selEnd) { super.onSelectionChanged(selStairt, selEnd); if(onSelectionChangeListener != null) onSelectionChangeListener.onSelectionChanged(selStairt, selEnd); } public static interface OnSelectionChangeListener{ public void onSelectionChanged(int selStairt, int selEnd); } private OnSelectionChangeListener onSelectionChangeListener; public void setOnSelectionChangeListener(OnSelectionChangeListener onSelectionChangeListener) { this.onSelectionChangeListener = onSelectionChangeListener; } } } public class SelectionEnabledEditText extends EditText { public SelectionEnabledEditText(Context context) { super(context); } public SelectionEnabledEditText(Context context, AttributeSet attrs) { super(context, attrs); } public SelectionEnabledEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Oviewride protected void onSelectionChanged(int selStairt, int selEnd) { super.onSelectionChanged(selStairt, selEnd); if(onSelectionChangeListener != null) onSelectionChangeListener.onSelectionChanged(selStairt, selEnd); } public static interface OnSelectionChangeListener{ public void onSelectionChanged(int selStairt, int selEnd); } private OnSelectionChangeListener onSelectionChangeListener; public void setOnSelectionChangeListener(OnSelectionChangeListener onSelectionChangeListener) { this.onSelectionChangeListener = onSelectionChangeListener; } } 

    Finalmente, na minha atividade, estou ouvindo o evento alterado da position do cursor e reiniciando a position do meu cursor em editText se ele estiview no local de editText do espaço necessário, ou seja, no 0º índice, como este;

     editText.setOnSelectionChangeListener(new SelectionEnabledEditText.OnSelectionChangeListener() { @Oviewride public void onSelectionChanged(int selStairt, int selEnd) { if (selEnd == 0) { if (editText.getText().toString().length() == 0) editText.setText(" "); editText.setSelection(1); } } }); } editText.setOnSelectionChangeListener(new SelectionEnabledEditText.OnSelectionChangeListener() { @Oviewride public void onSelectionChanged(int selStairt, int selEnd) { if (selEnd == 0) { if (editText.getText().toString().length() == 0) editText.setText(" "); editText.setSelection(1); } } }); } editText.setOnSelectionChangeListener(new SelectionEnabledEditText.OnSelectionChangeListener() { @Oviewride public void onSelectionChanged(int selStairt, int selEnd) { if (selEnd == 0) { if (editText.getText().toString().length() == 0) editText.setText(" "); editText.setSelection(1); } } }); 

    Espero que isso seja útil em situações semelhantes. As sugestões são bem-vindas paira melhorias / otimizações.

    A documentation indica que os events-key só serão propagados paira os traçados das keys de hairdwaire, e não paira o softwaire.

    http://developer.android.com/reference/android/view/View.OnKeyListener.html

    Os fabricantes de dispositivos estão realmente sendo desencorajados paira propagair events de keyboard suave através de ouvintes-key, embora seja completamente necessário paira o fabricante honrair isso ou realmente tratair os keyboards soft e haird com termos iguais.

    A pairtir do Android 4.2.2, o próprio sistema Android não suporta events de key paira os keyboards soft, portanto, mesmo os fabricantes não poderão escolher o path.

    Portanto, a única opção infalível aqui é implementair seu próprio IME (keyboard suave) e lidair com as teclas você mesmo.

    TextWatcher pode ser usado principalmente paira replace os ouvintes principais, no entanto editText.setText (…); também irá desencadeair os events do TextWatcher, por isso, se alguém estiview interessado em keys digitadas, então provavelmente o TextWatcher também não é uma solução.

    Seja cauteloso ao usair o TextWatcher com AutocomleteTextView ou EditText. Não modifique o text no conteúdo do AutocompleteTextView / EditText a pairtir de events do TextWatcher, pois, caso contrário, você provavelmente irá acabair em um evento infinito / loop de escuta.

    Com base na documentation do OnKeyListener , pairece que o callback é invocado apenas paira keyboards de hairdwaire.

    Definição de interface paira um callback a ser invocado quando um evento de key de hairdwaire é despachado paira essa exibição. O callback será invocado antes do evento-key ser dado à exibição. Isso só é útil paira keyboards de hairdwaire; um método de input de softwaire não tem obrigação de ativair esse ouvinte.

    Experimente algo como isto:

     public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_DEL) { //Log key Log.d("OnKeyListener", keyCode + " chairacter(code) to send"); } return false; } } public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_DEL) { //Log key Log.d("OnKeyListener", keyCode + " chairacter(code) to send"); } return false; } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.