Ocultación de la tarjeta de teclado de forma fiable

Tengo una aplicación, y necesito cerrar el softkeyboard en una cantidad bastante grande de acciones . Por ejemplo, al hacer clic en un botón , cuando se dibuja un nuevo diseño , en el cambio de orientación de pantalla , cuando el controlador le dice a la interfaz de usuario, etcétera. Utilizo el optionsMenuButton para voltear la visión con un ViewFlipper, y obviamente quiero que el teclado se oculte en la opinión tirada (allí no es ningún campo de entrada allí).

He probado estos hasta ahora y decir por qué no son fiables:

Este no funcionó porque tengo un montón de editTexts, y otras vistas. Necesito una más genérica, una que no requiere una visión como argumento, si es posible.

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

Este no funciona en absoluto para mí:

 getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

Éste funciona, pero inmediatamente abre el teclado otra vez cuando se gira la vista.

 InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); 

Este funciona a veces, pero getCurrentFocus () devuelve null la mayor parte del tiempo.

 InputMethodManager inputManager = (InputMethodManager) Context.getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); 

Éste sólo funciona si se muestra el teclado:

 getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK); 

Éste no funciona con el EditText como el primer pedazo de código, pero con el Layout de raíz, que cambia en el cambio de orientación y cada vez que se llama al oncreate. Tengo diverso XML de la disposición para el paisaje / retrato y normal / grande. Todos los Layouts raíz tienen la root ID. Esto funciona muy bien la primera vez, pero después de eso, ya no funciona.

 InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.hideSoftInputFromWindow(findViewById(R.id.root).getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); 

Bottomline: He intentado hella gran cantidad de métodos de ocultar teclado, pero ninguno de ellos parece funcionar con fiabilidad. ¿Hay algún método para ocultar el teclado blando de forma fiable?

Puesto que necesitas un EditText para abrir el teclado, busca el particular y usa el primer método que apareces para ocultar el teclado:

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

Sin embargo, necesitará que EditText . En primer lugar, obtener todas las vistas:

 public static ArrayList<View> getAllViewsFromRoots(View...roots) { ArrayList<View> result = new ArrayList<View>(); for (View root : roots) { getAllViews(result, root); } return result; } private static void getAllViews(ArrayList<View> allviews, View parent) { allviews.add(parent); if (parent instanceof ViewGroup) { ViewGroup viewGroup = (ViewGroup)parent; for (int i = 0; i < viewGroup.getChildCount(); i++) { getAllViews(allviews, viewGroup.getChildAt(i)); } } } 

A continuación, obtenga un EditText que sea visible.

 public static EditText getEditText(View root) { ArrayList<View> views = getAllViewsFromRoots(root); for (View view : views) { if (view instanceof EditText && view.getVisibility() == View.VISIBLE) { return (EditText) view; } } return null; } 

Llame a algún lugar:

 Toolkit.getEditText(((ViewParent) findViewById(android.R.id.content)).getChildAt(0)); 

Con eso, llamar al método de ocultación.

Creo que si manejas el caso nulo de getCurrentFocus (), eres bueno para ir. ¡Utilizo el método abajo y funciona como un encanto!

  /* Hide Keyboard */ public static void hideKeyboard(Activity activity){ InputMethodManager inputMethodManager = (InputMethodManager)activity .getSystemService(Context.INPUT_METHOD_SERVICE); View focus = activity.getCurrentFocus(); if(focus != null) inputMethodManager.hideSoftInputFromWindow(focus.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } 

Este trabaja para mí siempre:

 InputMethodManager im = (InputMethodManager) getSystemService(MyActivity.INPUT_METHOD_SERVICE); im.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); 

Sólo esta solución funcionó para mí:

 mActivity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

Tuve un diálogo con el campo de entrada, ocultando el diálogo no ocultar el teclado en la tableta.

Esto debería funcionar para la mayoría de los casos.

 InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(new View(this).getWindowToken(), 0); 

No hay necesidad de preocuparse por el puntero nulo también.

  • Error al cambiar la configuración regional de db '/data/data/my.easymedi.controller/databases/EasyMediInfo.db' a 'en_US'
  • Cómo establecer android: propiedad de ángulo de GradientDrawable de forma programática?
  • Cómo encontrar tamaño de matriz bidimensional en JNI
  • Problema de velocidad de Android con la deserialización mediante SimpleXML
  • ¿Cómo detectar y gestionar la llamada entrante (Android)?
  • Descargar la aplicación de Google Play por programación
  • Permisos de archivo en Android
  • Error al analizar xml: prefijo sin consolidar de com.google.android.gms.ads.AdView
  • Android-Magento- Cómo obtener los detalles de varios productos en Android mediante XML-RPC
  • Cómo arreglar "matriz tipo esperado encontrado java.util.arraylist"?
  • FindViewById no funciona en una función estática dentro del fragmento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.