Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


OnKeyListener no funciona en el teclado virtual

No entiendo por qué este código no funciona. Sólo se detectan retroceso y tecla de retorno. El oyente no se dispara para ninguna otra clave. Mi dispositivo es Nexus One.

Intenté anular el método OnKeyDown de la actividad y eso es aún peor. El único botón detectado era el botón de retroceso del hardware.

Estoy viendo alrededor de una sugerencia para usar TextWatcher y onTextChanged, mientras que podría funcionar en algunos casos, no es un trabajo real alrededor. Por ejemplo, si el cuadro de texto está vacío, no detectará si el usuario presiona el botón BackSpace (Eliminar). Entonces, ¿alguna idea?

TextView txtInput = (TextView)findViewById(R.id.txtInput); txtInput.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { makeToast(keyCode + " key pressed"); return true; } }); 

  • ¿Puede la página web estar consciente del teclado virtual android
  • 5 Solutions collect form web for “OnKeyListener no funciona en el teclado virtual”

    De acuerdo. Finalmente me di cuenta de cómo hacer lo que quiero, y no estoy orgulloso de Android para esto.

    Estoy escribiendo la aplicación de servidor / cliente donde en el cliente tengo que abrir SoftKeyboard y enviar teclas presionadas (caracteres y tecla DEL) … Cada vez que se presiona la tecla, ese carácter se envía al servidor. Si pulsa DEL, enviaré la secuencia {BS} al servidor.

    Para hacer eso tuve que implementar TextWatcher y onTextChange que funciona bien, excepto por la situación cuando EditText está vacío y el usuario pulsa la tecla DEL. Puesto que no hay ningún cambio en EditText no hay manera de detectar que la tecla DEL se presiona.

    Además de TextWatcher, tuve que implementar onKeyListener que adjunto a mi control EditText. Este onKeyListener ignora todas las teclas de SoftKeyboard excepto DEL y RETURN. No sé por qué? ¿Un error quizás?

    Aquí está mi código:

      TextView txtInput = (TextView)findViewById(R.id.txtInput); txtInput.addTextChangedListener(inputTextWatcher); txtInput.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { Log.d(TAG, keyCode + " character(code) to send"); return false; } }); 

    Y TextWatcher ….

     private TextWatcher inputTextWatcher = new TextWatcher() { public void afterTextChanged(Editable s) { } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { Log.d(TAG, s.charAt(count-1) + " character to send");; } }; 

    Has cometido un error aquí.
    Debe return true , Si ha manejado el evento. Si desea permitir que el evento sea manejado por el receptor siguiente , return false
    Siempre estás volviendo verdad

    Nota: mención de tipo de entrada en su edittext.

     <EditText android:id="@+id/select_category" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textCapSentences|textAutoCorrect" > edittext.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if ((actionId & EditorInfo.IME_MASK_ACTION) == EditorInfo.IME_ACTION_DONE) { //do something here. return true; } return false; } }); 

    ¿Ha intentado usar la subclase de escuchas específica para esa vista?

    Tuve un problema similar con un EditText. El siguiente código funcionó:

     private OnKeyListener keyListener = new EditText.OnKeyListener(){ @Override public boolean onKey(View v, int keyCode, KeyEvent event) { EditText et = (EditText) v; Log.i("APPEVENT", "Key hit: "+ event); //... return false; } }; 

    Pero si he utilizado el View.OnKeyListener , sólo registro backspace y entrar. Podría ser un problema similar con TextView . Quizás los oyentes clave de la subclase sean sensibles a más eventos para la subclase View dada.

    Tuvimos el problema de TextWatcher en el iPhone también – si el búfer está vacío, el teclado no envía el evento del. Trabajamos alrededor de ello precargando el búfer del teclado con 1000 caracteres. Por suerte, nuestra aplicación oculta el campo de edición detrás del teclado para que los 1000 caracteres no se vean. Es feo, pero funciona (a menos que el usuario haga clic en 1000 eliminaciones en una fila antes de introducir cualquier dato!)

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.