En mi opinión, tengo una búsqueda EditText y me gustaría activar programáticamente el comportamiento de un evento de clic en el campo, es decir, enfocar el campo de texto Y mostrar el teclado en pantalla si es necesario (si no hay un teclado físico disponible).
Lo intenté field.requestFocus()
. El campo se enfoca realmente pero no se muestra el teclado virtual.
Lo intenté field.performClick()
. Pero eso solo llama al OnClickListener del campo.
Alguna idea ?
android
android-edittext
sdabet
fuente
fuente
field.requestFocus()
alonResume()
método de la actividad (en lugar deonCreate()
). No sé exactamente por qué funciona ...onResume
porqueonResume
se llama despuésonCreate
, por lofield
que no existe hasta queonCreate
se ejecuta. Vea aquí: developer.android.com/reference/android/app/…Aquí está el código que funcionó para mí.
edittext.post(new Runnable() { public void run() { edittext.requestFocusFromTouch(); InputMethodManager lManager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); lManager.showSoftInput(edittext, 0); } });
¡Eso es! Disfruta;)
fuente
EditText
programáticamente cuando el usuario presiona el botón.EditText
desde un modal de diálogo. Android establece algunas banderas que hacen que este control no reciba ningún toque. Si agrega el campo en el ejecutable, las banderas no se establecen.InputType
delEditText
se está configurado en nulo por Android. Si configura elInputType
, debería funcionar.El siguiente código funcionó para mí , después de que las otras dos respuestas no funcionaron para mí :
@Override public void onResume() { super.onResume(); SingletonBus.INSTANCE.getBus().register(this); //passwordInput.requestFocus(); <-- that doesn't work passwordInput.postDelayed(new ShowKeyboard(), 300); //250 sometimes doesn't run if returning from LockScreen }
Donde
ShowKeyboard
estaprivate class ShowKeyboard implements Runnable { @Override public void run() { passwordInput.setFocusableInTouchMode(true); // passwordInput.requestFocusFromTouch(); passwordInput.requestFocus(); getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(passwordInput, 0); } }
Después de una entrada exitosa, también me aseguro de ocultar el teclado
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)) .hideSoftInputFromWindow(getView().getWindowToken(), 0);
Técnicamente, acabo de agregar 300 ms de retraso antes de ejecutar la solicitud de visualización del teclado en pantalla. Extraño, ¿verdad? También cambiado
requestFocus()
arequestFocusFromTouch()
.EDITAR: No lo use,
requestFocusFromTouch()
le da un evento táctil al lanzador. Quédate conrequestFocus()
.EDIT2: En Dialogs (
DialogFragment
), use lo siguientegetDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
en vez de
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
fuente
requestFocusFromTouch()
parece desencadenar un evento táctil en el lanzador. Esto es raro.field.post(new Runnable() { @Override public void run() { field.requestFocus(); field.onKeyUp(KeyEvent.KEYCODE_DPAD_CENTER, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER)); } });
fuente
En mi caso, quería mostrar el teclado virtual sin referencia a un cuadro de texto específico, así que usé la primera parte de la respuesta aceptada para enfocar :
edittext.setFocusableInTouchMode(true); edittext.requestFocus();
Luego muestro el teclado virtual :
InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
fuente