studio android onkeypress onkeydown virtual-keyboard

keydown android studio



onKeyListener no funciona en el teclado virtual (5)

¿Ha intentado usar la subclase de escucha 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 usé View.OnKeyListener , solo registro la View.OnKeyListener retroceso y entro. Podría ser un problema similar con TextView . Quizás los oyentes clave de la subclase son sensibles a más eventos para la subclase de View dada.

No entiendo por qué esta pieza de código no funciona. Solo se detectan retroceso y clave de retorno. El oyente no dispara por ninguna otra tecla. 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 fue el botón de retroceso de hardware.

Estoy viendo una sugerencia para usar TextWatcher y onTextChanged, aunque eso podría funcionar en algunos casos, no es una solución real. Por ejemplo, si el cuadro de texto está vacío, no detectará si el usuario presiona el botón Retroceso (Eliminar). ¿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; } });


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

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

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

Además de TextWatcher, tuve que implementar onKeyListener que adjunté a mi control EditText. Este onKeyListener ignora todas las teclas en SoftKeyboard excepto DEL y RETURN. No estoy seguro de por qué? Un error tal vez?

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");; } };


Nota: inputtype mención 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; } });


También tuvimos el problema de TextWatcher en el iPhone: si el búfer está vacío, el teclado no envía el evento. Resolvimos el problema precargando el búfer del teclado con 1000 caracteres. Afortunadamente, nuestra aplicación ocultó el campo de edición detrás del teclado para que no se vean los 1000 caracteres. Es feo, pero funciona (a menos que el usuario elimine 1000 eliminaciones en una fila antes de ingresar cualquier información)


Usted ha cometido un error aquí.
debe return true , si maneja el evento. Si desea permitir que el evento sea manejado por el siguiente receptor , return false
Siempre estas volviendo verdad