Cómo mostrar el teclado virtual cuando el texto de edición está enfocado
Quiero mostrar automáticamente el teclado virtual cuando un EditText
está enfocado (si el dispositivo no tiene teclado físico) y tengo dos problemas:
Activity
Cuando se muestra mi , miEditText
está enfocado pero el teclado no se muestra, necesito hacer clic nuevamente en él para mostrar el teclado (debe mostrarse cuandoActivity
se muestra mi).Y cuando hago clic en Listo en el teclado, el teclado se descarta pero
EditText
permanece 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 EditText
estado (enfocado/no enfocado) y por supuesto no presenta un teclado virtual si lo hay físico.
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 View
para 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);
}
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).