2010-04-18 17 views
11

he utilizado un poco de código de Android para anular el botón "Done" en mi campo EditarTexto:Android: Cómo ocultar el teclado en un sobrescrito pulsación de tecla "Hecho" de EditarTexto

myEditField.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
     @Override 
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
      if (actionId == EditorInfo.IME_ACTION_DONE) { 

       mySubroutine(); 

       return true; 
      } 
      return false; 
     } 
    }); 

Activar el campo se abre la teclado, y presionar "Listo" evalúa mySubroutine() exitosamente. Sin embargo, el teclado ya no desaparece cuando presiono "Listo". ¿Cómo restauro este comportamiento predeterminado a la rutina?

Respuesta

43

Por qué no:

myEditField.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
     if (actionId == EditorInfo.IME_ACTION_DONE) { 

      mySubroutine(); 
     } 
     return false; 
    } 
}); 

Sólo return false después de manipular su código. Esto se puede interpretar ya que no importa cuál sea tu código (mySubroutine()) aún usará la acción predeterminada después. Si devuelve "verdadero", está diciendo que es un codificador feliz y que todo lo que debe hacerse se ha realizado en su mySubroutine() y que la acción predeterminada no es necesaria para tomar medidas.

+0

Esta es la forma correcta, ya que de lo contrario irá en contra de cómo se diseñó el marco. Lo he explicado más detalladamente en la respuesta _way-over-the-top_ en una pregunta relacionada [aquí] (http://stackoverflow.com/a/25119481/2837443) –

+0

No he tocado el código de Android en cuatro años, así que tomaré su palabra para eso. –

12

Puede cerrar el teclado haciendo:

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.hideSoftInputFromWindow(getWindowToken(), 0); 
+0

Estoy usando Eclipse y me estoy poniendo los dos errores siguientes: "InputMethodManager no se puede resolver a un tipo" y "el método getWindowToken () no está definido para el tipo nuevo TextView.onEditorActionListener() {} " No soy un programador de Java, así que no sé cómo interpretarlos. ¿Debo incluir algo antes? –

+0

Intenta presionar Control + Mayús + o para hacer las importaciones correspondientes. – Macarse

+5

Gracias, había una dependencia que necesitaba. También tuve que reemplazar getWindowToken() con v.getWindowToken() pero de lo contrario funciona muy bien, ¡gracias! Ahora solo necesito entender lo que hizo –

7

Debe adjuntar una OnClickListener al botón que ejecuta el siguiente código:

InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE); 
imm.hideSoftInputFromWindow(editview.getWindowToken(), 0); 
+0

respuesta ilegible – AlexVogel

+0

Me funcionó – SolArabehety

0

que tenían el mismo problema. Inmediatamente después de que EditText VISIBILITY cambiara de GONE a VISIBLE, tuve que establecer el foco y mostrar el teclado virtual. He logrado esto usando el siguiente código:

 (new Handler()).postDelayed(new Runnable() { 

     public void run() {    yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0)); 
      yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));      

     } 
    }, 200); 
Cuestiones relacionadas