Cómo capturar una pulsación de tecla "Hecho" desde el teclado virtual

¿Cómo puedo capturar eventos clave específicos desde el teclado virtual? Específicamente estoy interesado en la tecla "Hecho".

Nota: Esta respuesta es antigua y ya no funciona. Vea las respuestas a continuación.

Se captura el KeyEvent y, a continuación, compruebe su clave. FLAG_EDITOR_ACTION se utiliza para identificar las teclas de entrada que vienen de un IME cuya tecla de entrada ha sido auto-etiquetada "siguiente" o "hecho"

if (event.getKeyCode() == KeyEvent.FLAG_EDITOR_ACTION) //your code here 

Encuentra los documentos aquí .

No estoy muy seguro de qué tipo de oyente se utilizó en la respuesta aceptada. Utilicé el OnKeyListener unido a un EditText y no podía coger después ni hecho.

Sin embargo, utilizando OnEditorActionListener trabajado y también me permitió diferenciar entre ellos mediante la comparación del valor de la acción con las constantes definidas EditorInfo.IME_ACTION_NEXT y EditorInfo.IME_ACTION_DONE .

 editText.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_MASK_ACTION) { doSomething(); return true; } else { return false; } } }); 

@ La respuesta de Swato no fue completa para mí (y no compila!) Así que estoy mostrando cómo hacer la comparación con las acciones DONE y NEXT.

 editText.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView view, int actionId, KeyEvent event) { int result = actionId & EditorInfo.IME_MASK_ACTION; switch(result) { case EditorInfo.IME_ACTION_DONE: // done stuff break; case EditorInfo.IME_ACTION_NEXT: // next stuff break; } } }); 

También quiero señalar que para JellyBean y mayor OnEditorActionListener es necesario escuchar "entrar" o "siguiente" y no se puede utilizar OnKeyListener. De los documentos:

Dado que los métodos de entrada suave pueden utilizar formas múltiples e inventivas de introducir texto, no hay garantía de que una pulsación de tecla en un teclado virtual genere un evento clave: esto queda a discreción del IME y de hecho se desaconseja el envío de dichos eventos . Nunca debe confiar en recibir KeyEvents para ninguna tecla en un método de entrada suave.

Referencia: http://developer.android.com/reference/android/view/KeyEvent.html

Solo haz esto:

 editText.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView view, int actionId, KeyEvent event) { if(actionId == EditorInfo.IME_ACTION_DONE) { //Do Something } return false; } }); 
  etSearchFriends = (EditText) findViewById(R.id.etSearchConn); etSearchFriends.setOnKeyListener(new OnKeyListener() { public boolean onKey(View v, int keyCode, KeyEvent event) { // If the event is a key-down event on the "enter" button if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) { Toast.makeText(ACTIVITY_NAME.this, etSearchFriends.getText(),Toast.LENGTH_SHORT).show(); return true; } return false; } }); 

Tengo EditText que busca nombres, y muestra automáticamente resultados abajo en ListView. El teclado de SoftInput sólo mostró el botón "siguiente" e introdujo el signo, que no hizo nada. Sólo quería botón hecho (no siguiente o entrar en el signo) y también quería que cuando se presiona, debe cerrar el teclado porque el usuario debe ver los resultados por debajo de él.

Solución que encontré / por el Sr. Cyril Mottier en su blog / fue muy sencillo y funcionó sin ningún código adicional: en xml donde se encuentra EditText, esto debería escribirse: android: imeOptions = "actionDone"

Por lo que hidding teclado con botón Hecho, EditText debería tener este aspecto:

 <EditText android:id="@+id/editText1central" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/imageView1" android:layout_toLeftOf="@+id/imageView2tie" android:ems="10" android:imeOptions="actionDone" android:hint="@string/trazi" android:inputType="textPersonName" /> 

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

Para capturar una tecla "Hecho" presione desde el método de onKeyUp Activación de la tecla Override del teclado. La configuración de un oyente OnKeyListener para una vista no funcionará porque las pulsaciones de teclas en los métodos de entrada de software generalmente no activarán los métodos de este oyente. Esta llamada de llamada se invoca cuando se pulsa una tecla de hardware en la vista.

 // Called when a key was released and not handled by any of the views inside of the activity. @Override public boolean onKeyUp(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_ENTER: // code here break; default: return super.onKeyUp(keyCode, event); } return true; } 

IME_MASK_ACTION es 255, mientras que el actionId recibido es 6, y mi compilador no acepta

 if (actionId & EditorInfo.IME_MASK_ACTION) 

Que es un int. ¿Cuál es el uso de & -ing 255 de todos modos? Así que la prueba simplemente puede ser

 public boolean onEditorAction(TextView view, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_DONE) ... 

Puede anular el evento de clave hecho por este método:

 editText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_DONE) { // do your stuff here } return false; } }); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.