Cómo mostrar el teclado virtual cuando el texto de edición está enfocado

Resuelto Ludovic Landry asked hace 54 años • 49 respuestas

Quiero mostrar automáticamente el teclado virtual cuando un EditTextestá enfocado (si el dispositivo no tiene teclado físico) y tengo dos problemas:

  1. ActivityCuando se muestra mi , mi EditTextestá enfocado pero el teclado no se muestra, necesito hacer clic nuevamente en él para mostrar el teclado (debe mostrarse cuando Activityse muestra mi).

  2. Y cuando hago clic en Listo en el teclado, el teclado se descarta pero EditTextpermanece enfocado y no quiero (porque mi edición ya está hecha).

Para resumir, mi problema es tener algo más parecido en el iPhone: que mantiene el teclado sincronizado con mi EditTextestado (enfocado/no enfocado) y por supuesto no presenta un teclado virtual si lo hay físico.

Ludovic Landry avatar Jan 01 '70 08:01 Ludovic Landry
Aceptado

Para forzar la aparición del teclado en pantalla, puede utilizar

EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
yourEditText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);

Y para quitar el foco EditText, lamentablemente es necesario tener un muñeco Viewpara captar el foco.


Para cerrarlo puedes usar

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

Esto funciona para usarlo en un diálogo.

public void showKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

public void closeKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
}
raukodraug avatar Feb 24 '2011 15:02 raukodraug

Yo tuve el mismo problema. Inmediatamente después de que la VISIBILIDAD de editText cambiara de IDO a VISIBLE, tuve que establecer el foco y mostrar el teclado virtual. Logré esto usando el siguiente código:

new Handler().postDelayed(new Runnable() {
            
    public void run() {
//        ((EditText) findViewById(R.id.et_find)).requestFocus();
//              
        EditText yourEditText= (EditText) findViewById(R.id.et_find);
//        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
//        imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);

        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 0f, 0f, 0));
        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, 0f, 0f, 0));                          
    }
}, 200);

A mí me funciona con un retraso de 100 ms, pero falló sin ningún retraso o con solo un retraso de 1 ms.

La parte comentada del código muestra otro enfoque, que sólo funciona en algunos dispositivos. Probé en las versiones del sistema operativo 2.2 (emulador), 2.2.1 (dispositivo real) y 1.6 (emulador).

Mike Keskinov avatar Oct 16 '2011 14:10 Mike Keskinov