Cómo ocultar el teclado en pantalla cuando un DialogFragment es cancelado por el evento setCanceledOnTouchOutside

Si un edittext está actualmente enfocado y el usuario hace clic fuera del DialogFragment; Quiero que el teclado en pantalla desaparezca. Puedo conseguir que funcione para cuando el DialogFragment es descartado de esta manera:

InputMethodManager imm; public View onCreateView(LayoutInflater inflator, ViewGroup container, Bundle savedInstanceState) { imm = (InputMethodManager)getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE); ...} @Override public void dismiss(){ imm.hideSoftInputFromWindow(getView().getWindowToken(), 0); super.dismiss(); } 

Sin embargo, si intento lo mismo para cuando se cancela tocando fuera del fragmento de diálogo, no funcionará. Estoy tratando de hacer esto por sobreescribir onCancel como así:

 @Override public void onCancel(DialogInterface dialog){ imm.hideSoftInputFromWindow(getView().getWindowToken(), 0); super.onCancel(dialog); } 

La función se llama cuando ocurre el evento de toque externo, pero el teclado no se quita.

4 Solutions collect form web for “Cómo ocultar el teclado en pantalla cuando un DialogFragment es cancelado por el evento setCanceledOnTouchOutside”

Esto es lo que hice para que esto finalmente funcione … Necesitaba no usar el widget para el teclado … pero usar el currentfocus para obtener el windowtoken para quitar el teclado cuando un usuario seleccionó algo fuera del cuadro de diálogo …

 @Override public void onStop() { // make sure the keyboard goes away when the user selects something outside the view (cancelled outside) if( Utilities.isValidActivity(this.getActivity())) { InputMethodManager imm = (InputMethodManager)this.getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); // not the search view but the current focus at this point imm.hideSoftInputFromWindow(this.getActivity().getCurrentFocus().getWindowToken(), 0); } super.onStop(); } 

Pude resolver el mismo problema subclasificando el diálogo y ocultando el teclado antes de que se ejecutara el código de cancelación en el diálogo.

 @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Dialog dialog = new Dialog(getActivity(), getTheme()) { @Override public void cancel() { if (getActivity() != null && getView() != null) { InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(getView().getWindowToken(), 0); } super.cancel(); } }; return dialog; } 

He intentado muchos enfoques alternativos, incluyendo el uso de DialogFragment onCancel y onDimiss oyentes en vano. Creo que el problema es que los oyentes se llaman de forma asíncrona, mientras que el despedir / cancelar se maneja de forma sincrónica; Por lo que en el momento en que su oyente se llama para ocultar el teclado, el símbolo de ventana ya no existe.

Tuve el mismo problema y lo resolví poniendo esto en el AndroidManifest bajo la actividad en la que desovar el DialogFragment:

 android:windowSoftInputMode="stateHidden" 

Intente agregar un onDismissListener como este.

 dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { // TODO Auto-generated method stub dismiss(); } }); 
  • Retener el oyente tras la rotación de la pantalla - DialogFragment con DatePicker
  • CommitAllowingStateLoss en DialogFragment
  • Detectar el botón Atrás pero no descartar el diálogo
  • Cómo puedo establecer un intervalo de minutos en DialogFragment
  • BottomSheetDialogFragment - escucha despedido por evento de usuario
  • DialogFragment con ListView personalizado
  • Superpuesto por la barra de estado cuando se muestra el fragmento de diálogo, solo en Android4.4
  • Inicio de DialogFragment desde una clase que se extiende RecyclerView.ViewHolder
  • Cambiar DialogFragment entrar / salir de la transición justo antes de despedir
  • Java.lang.IllegalStateException: No se puede realizar esta acción después de onSaveInstanceState con DialogFragment
  • ¿Cómo descartar de forma segura DialogFragment en onstop ()?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.