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:
- Android: EditText en el problema de ListView
- No encontré la clase en la ruta: dexpathlist
- OnSensorChanged () no se llama
- ¿Hay alguna manera de usar setOnClickListener con un Spinner de Android?
- Android jobScheduler no se detendrá con jobFinished (params, false)
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?
- ¿Limpiar automáticamente LogCat en cada depuración / ejecución de Eclipse?
- ¿Cómo obtener la posición actual de la imagen visualizada?
- ¿Cómo deshacerse de la advertencia de llamada sospechosa en Android Studio?
- Phonegap vs nativo en la prueba de rendimiento de Android
- Ubicación Actualización en función del estado del dispositivo
- Tipos incompatibles: HomeFragment no se puede convertir en Fragment en Android
- Android ht stime, utime?
- No se puede cargar el archivo HTML local en Android WebView
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.
- Android No se pueden retener fragmentos que están anidados en otros fragmentos
- Añadiendo un fragmento en la parte superior de otro fragmento onClickListener