teclado studio samsung pulsar programáticamente pantalla ocultar mostrar fuera edittext deshabilitar como cerrar android

android - studio - Ocultar el teclado virtual al perder el foco



ocultar teclado android in fragment (8)

Cuando tenemos un EditText y pierde el foco (a un elemento que no necesita un teclado), ¿debería ocultarse el teclado virtual automáticamente o se supone que debemos ocultarlo?

Estoy moviendo el foco de un AutoCompleteSearchView (que debería comportarse como un EditText supongo) a un Button , requestFocus() devuelve verdadero, pero el teclado no se oculta.


Android no ocultará el teclado por ti. Si desea que el teclado se oculte cuando EditText pierde el foco, intente utilizar un método como este en ese evento:

private void hideKeypad() { EditText edtView = (EditText) findViewById(R.id.e_id); InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(edtView.getWindowToken(), 0); }


La mejor manera es establecer OnFocusChangeListener para EditText, y luego agregar el código al teclado en el método OnFocusChange del oyente. Android cerrará automáticamente el teclado cuando EditText pierda el foco.

Algo así en tu método OnCreate:

EditText editText = (EditText) findViewById(R.id.textbox); OnFocusChangeListener ofcListener = new MyFocusChangeListener(); editText.setOnFocusChangeListener(ofcListener);

y luego agrega la clase:

private class MyFocusChangeListener implements OnFocusChangeListener { public void onFocusChange(View v, boolean hasFocus){ if(v.getId() == R.id.textbox && !hasFocus) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } } }


La solución a este problema ya se ha encontrado here .
Está utilizando DispatchTouchEvent en la actividad y no engancha cada EditText al evento FocusChange o Touch.
Es una solución mucho mejor.

Mi implementación de Xamarin es la siguiente:

public override bool DispatchTouchEvent(MotionEvent ev) { if (ev.Action == MotionEventActions.Down) { var text = CurrentFocus as EditText; if (text != null) { var outRect = new Rect(); text.GetGlobalVisibleRect(outRect); if (outRect.Contains((int) ev.RawX, (int) ev.RawY)) return base.DispatchTouchEvent(ev); text.ClearFocus(); HideSoftKeyboard(); } } return base.DispatchTouchEvent(ev); } protected void HideSoftKeyboard() { var inputMethodManager = (InputMethodManager) GetSystemService(InputMethodService); inputMethodManager.HideSoftInputFromWindow(CurrentFocus.WindowToken, 0); }


Prueba esto

/** * Hide keyboard on touch of UI */ public void hideKeyboard(View view) { if (view instanceof ViewGroup) { for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { View innerView = ((ViewGroup) view).getChildAt(i); hideKeyboard(innerView); } } if (!(view instanceof EditText)) { view.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { hideSoftKeyboard(v); return false; } }); } } /** * Hide keyboard while focus is moved */ public void hideSoftKeyboard(View view) { if (view != null) { InputMethodManager inputManager = (InputMethodManager) contentsContext_ .getSystemService(Context.INPUT_METHOD_SERVICE); if (inputManager != null) { if (android.os.Build.VERSION.SDK_INT < 11) { inputManager.hideSoftInputFromWindow(view.getWindowToken(), 0); } else { if (this.getCurrentFocus() != null) { inputManager.hideSoftInputFromWindow(this .getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } view.clearFocus(); } view.clearFocus(); } } }


Prueba esto, puede ser que resolverá tu problema.

private void hideKeyboard() { InputMethodManager mImMan = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); mImMan.hideSoftInputFromWindow(mYourEdttxtName.getWindowToken(), 0); }

Puede encontrar más información here.


Puede anular el método dispatchTouchEvent para lograrlo:

@Override public boolean dispatchTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { /** * It gets into the above IF-BLOCK if anywhere the screen is touched. */ View v = getCurrentFocus(); if ( v instanceof EditText) { /** * Now, it gets into the above IF-BLOCK if an EditText is already in focus, and you tap somewhere else * to take the focus away from that particular EditText. It could have 2 cases after tapping: * 1. No EditText has focus * 2. Focus is just shifted to the other EditText */ Rect outRect = new Rect(); v.getGlobalVisibleRect(outRect); if (!outRect.contains((int)event.getRawX(), (int)event.getRawY())) { v.clearFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } } } return super.dispatchTouchEvent( event ); }

Bonificación: en el caso de que EditText gane enfoque, el orden de evento desencadenado es:

  1. onFocusChange() de otro EditText se llama (si ese otro edittext está perdiendo el foco)
  2. ACTION_DOWN se llama
  3. Finalmente, se onFocusChange() método onFocusChange() de EditText.

Solo crea un método estático

public static void touchScreenAndHideKeyboardOnFocus(View view, final Activity activity) { if (view instanceof EditText) { view.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { if(activity != null) { InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); if (activity.getCurrentFocus() != null) { inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } } } } }); } if (view instanceof ViewGroup) { for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { View innerView = ((ViewGroup) view).getChildAt(i); touchScreenAndHideKeyboardOnFocus(innerView, activity); } } }

view es una vista de raíz para su diseño ... pero tenga cuidado, si tiene otro listener de enfoque en su texto de edición ...


mi problema resuelto con este código (en Fragmento)

LinearLayout linearLayoutApply=(LinearLayout)rootView.findViewById(id.LinearLayoutApply); linearLayoutApply.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if(hasFocus) { hideKeyBoard(v); } } });

hideKeyBoard

public void hideKeyBoard(View v) { InputMethodManager imm=(InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0); }