2010-06-13 19 views

Respuesta

28

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

Captura KeyEvent y luego verifica su código clave. FLAG_EDITOR_ACTION se utiliza para identificar la tecla de entrada que vienen de un IME cuya tecla enter se ha auto-etiquetado "siguiente" o "hecho"

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

Encuentra los documentos here.

+1

Gracias! ¡eso resolvió mi pregunta! – oriharel

+0

Bien, me alegro de poder ayudar. :) –

+1

Desafortunadamente, esta respuesta carece de contexto :( – Sam

52

No estoy muy seguro de qué tipo de oyente se utilizó en la respuesta aceptada. Utilicé el OnKeyListener conectado a un EditText y no fue capaz de detectarlo ni tampoco lo hizo.

Sin embargo, usando OnEditorActionListener funcionó y también me permitió diferenciarlos comparando el valor de 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) != 0) { 
      doSomething(); 
      return true; 
     } 
     else { 
      return false; 
     } 
    } 
}); 
+1

Para JellyBean y superior OnEditorActionListener es necesario para este caso de uso en lugar de OnKeyListener. De los documentos: Como los métodos de entrada suaves pueden usar formas múltiples e ingeniosas de ingresar texto, no hay garantía de que presionar una tecla en un teclado virtual genere un evento clave: esto queda a la discreción del IME, y de hecho ** enviar tales eventos se desaconseja **. 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 –

+0

Gracias por su increíble consejo .. Está funcionando ahora –

+1

La respuesta de @JasonAxelson fue la mejor –

8
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; 
     } 

    }); 
+0

¿cómo puedo encontrar el código clave para cada tecla presionada desde el teclado? –

+0

@BhavanaVadodariya no puedes. Al menos no en Jelly Bean. Ver: http://developer.android.com/reference/android/view/KeyEvent.html –

34

@ respuesta de Swato no se completó para mí (y no compila!) Así que estoy mostrando cómo hacer la comparación con las acciones realizadas y el próximo.

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 superior OnEditorActionListener se necesita escuchar para 'entrar' o 'siguiente' y no se puede utilizar OnKeyListener. A partir de los documentos:

métodos de entrada Como blandos pueden utilizar múltiples e inventivas formas de introducir texto, no hay ninguna garantía de que cualquier pulsación de tecla en un teclado de software generará un evento clave: esto se deja a la discreción del IME, y de hecho el envío de tales eventos se desaconseja. Nunca confíe en recibir KeyEvents para ninguna tecla en un método de entrada suave.

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

+1

buena solución ... +1 – jagdish

+8

también podría valer la pena devolver verdadero o falso en el ejemplo – Sam

1

tengo EditarTexto que busca nombres, y se nota automáticamente los resultados a continuación en ListView. El teclado SoftInput solo mostró el botón "siguiente" e ingresó el signo, que no hizo nada. Solo quería el botón Hecho (no siguiente o ingresar signo) y también lo quería cuando lo presioné, debería cerrar el teclado porque el usuario debería ver los resultados debajo de él.

solución que encontré/por el Sr. Cyril Mottier en su blog/era muy simple y funcionó sin ningún código adicional: en XML donde se encuentra EditarTexto, esto debe ser escrito: android: imeOptions = "actionDone"

teclado para esconderse con el botón Hecho, EditarTexto 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" /> 
2

para coger una pulsación de tecla “Hecho” de método onKeyUp el teclado en pantalla de anulación de la actividad. Configurar un detector 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 devolución de llamada se invoca cuando se presiona 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; 
} 
+0

Exactamente lo que estaba buscando; -) Funciona bien incluso en cada 'EditText'! Gracias :-) – mmrmartin

+0

¡Esta es definitivamente la respuesta correcta! Trabaja muchas gracias. – xngigez

1

Nota: tipo de entrada mención en su texto de edición.

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

Eso sí, como 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; 
} 
}); 
0

IME_MASK_ACTION es de 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 puede ser simplemente

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

puede anular hecho acontecimiento clave de 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; 
    } 
}); 
0
editText = (EditText) findViewById(R.id.edit_text); 

editText.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
     if (actionId == EditorInfo.IME_ACTION_DONE) { 
      // code here 
     } 
     return false; 
    } 
}); 
Cuestiones relacionadas