Toque fuera de edittext para perder el foco

Sólo quiero cuando haga clic fuera del "edittext" para perder automáticamente el foco y ocultar el teclado. Por el momento, si hago clic en el "edittext" se centra pero necesito golpear el botón de atrás para desenfocar.

Supongamos que su EditText se coloca en Linear u otro ViewGroup. A continuación, debe hacer que este contenedor haga clic, se puede enfocar y focusableInTouchMode. Después de que establezca onClickListener a este contenedor con el siguiente código en el método onClick Override:

@Override public void onClick(View view) { InputMethodManager imm = (InputMethodManager) view.getContext() .getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } 

@woodshy tiene la respuesta para ocultar el teclado, pero tal vez poner el código en onClick no es tan bueno como ponerlo en onFocusChanged . En cuanto a forzarlo a perder el foco, usted necesita fijar el objeto que usted desea transferir el foco a, en su archivo de XML:

 android:focusable="true" android:focusableInTouchMode ="true" 

Para resolver este problema lo que tiene que hacer primero es usar setOnFocusChangeListener de ese Edittext

 edittext.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { Log.d("focus", "focus loosed"); // Do whatever you want here } else { Log.d("focus", "focused"); } } }); 

Y entonces lo que hay que hacer es anular dispatchTouchEvent en la actividad que contiene que Edittext ver a continuación el código

 @Override public boolean dispatchTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { View v = getCurrentFocus(); if ( v instanceof EditText) { Rect outRect = new Rect(); v.getGlobalVisibleRect(outRect); if (!outRect.contains((int)event.getRawX(), (int)event.getRawY())) { Log.d("focus", "touchevent"); v.clearFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } } } return super.dispatchTouchEvent(event); } 

Ahora lo que sucederá es cuando un usuario haga clic en el exterior, luego en primer lugar este dispatchTouchEvent se llamará que luego se borrará el foco de editext ahora su OnFocusChangeListener se llamará que se ha cambiado el enfoque, ahora aquí puede hacer cualquier cosa que quería hacer, la esperanza funciona 🙂

Así que busqué alrededor de un poco, y ninguna otra solución era exactamente lo que estaba buscando. En mi opinión, el enfoque se comporta de manera extraña en las vistas de EditText.

Lo que hice fue …

  1. Asegúrese de que la vista raíz sea RelativeLayout

  2. Agregue un diseño de superposición que esté sobre el área que hará que desaparezca el teclado, pero no el EditText. Algo como abajo:

En mi caso, el EditText estaba en un contenedor en la parte inferior de la pantalla. Así que cubrió todo lo demás.

  1. Tenga un método que se parezca un poco a este:
     Private void hideKeyboard () {
         Final InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE);
         Imm.hideSoftInputFromWindow (editText.getWindowToken (), 0);
         KeyboardOverlay.setVisibility (View.GONE);
         EditText.clearFocus ();
     }
  1. Ahora llame a este método en el onClick de la superposición que creó.

  2. Lo que queremos ahora es hacer visible la superposición al presionar editText. No puedes usar el evento onFocus (al menos no lo hice funcionar). Así que lo que hice fue administrar el evento onTouch en su lugar.

 EditText.setOnTouchListener (nuevo OnTouchListener () {

     @Anular
     Public boolean onTouch (vista final v, evento final de MotionEvent) {
         KeyboardOverlay.setVisibility (View.VISIBLE);
         EditText.requestFocus ();
         falso retorno;
     }
 });

RequestFocus () aquí es para no anular el evento de enfoque con el onTouch.

Un consejo rápido, cuando lo pruebes, puedes agregar un color de fondo a la superposición para ver exactamente lo que está sucediendo.

¡Espero que funcione para ti!

El código siguiente funciona perfectamente para mí, y lo utilizo regularmente para cerrar el SoftTeclado onTouch en cualquier lugar fuera del EditText.

 public void hideSoftKeyboard() { //Hides the SoftKeyboard InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0); } public void setupUI(View view) { String s = "inside"; //Set up touch listener for non-text box views to hide keyboard. if (!(view instanceof EditText)) { view.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { hideSoftKeyboard(); return false; } }); } //If a layout container, iterate over children and seed recursion. if (view instanceof ViewGroup) { for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { View innerView = ((ViewGroup) view).getChildAt(i); setupUI(innerView); } } } 

Así que sólo tiene que llamar a la función setupUI() una vez en su método onCreate() y voilla, su hidingSoftKeyboard está configurado!

Para perder el enfoque completo de EditText, simplemente haga editText.clearFocus() en su función hideSoftKeyboard ().

Tuve el mismo requisito que tuve que ocultar el teclado una vez que toco en cualquier parte fuera de mi cuadro de edición. El setOnFocusChangeListener no realiza el trabajo, ya que incluso si toca fuera del cuadro de texto de edición todavía está seleccionado.

Para esto he utilizado la solución edc598 aquí .

  • Primero consigo el MainLayout que contiene la vista entera y agrego el oyente del tacto a ella.
  • Cuando se activó el evento onTouch, compruebo si el cuadro EditText tiene foco.
  • Si el cuadro EditText tiene el foco entonces compruebo las coordenadas XY del evento.
  • Sobre la base de la colocación de mi cuadro de EditText ocultar el teclado si se toca en cualquier lugar fuera de la caja

Ejemplo de código modificado desde aquí :

 LinearLayout MainLayout = (LinearLayout) findViewById(R.id.MainLayout); EditText textBox = (EditText) findViewById(R.id.textBox); int X_TOP_LEFT = 157; int Y_TOP_LEFT = 388; int X_BOTTOM_RIGHT = 473; int Y_BOTTOM_RIGHT = 570; MainLayout.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub if(textBox.isFocused()){ Log.i("Focussed", "--" + event.getX() + " : " + event.getY() + "--"); if(event.getX() <= 157 || event.getY() <= 388 || event.getX() >= 473 || event.getY() >= 569){ //Will only enter this if the EditText already has focus //And if a touch event happens outside of the EditText textBox.clearFocus(); InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0); //Do something else } } Log.i("XY coordinate", "--" + event.getX() + " : " + event.getY() + "--"); //Toast.makeText(getBaseContext(), "Clicked", Toast.LENGTH_SHORT).show(); return false; } }); 
  • Cómo forzar el enfoque para editar el texto
  • Centrarse en EditText en ListView cuando los descendientes de bloque (Android)
  • En Android, ¿cuál es realmente el uso para enfocar el parámetro de área de peso?
  • Los elementos secundarios ExpandableListView no obtienen el enfoque cuando se tocan
  • Android: se centra en EditText después de la selección de Spinner
  • Android onfocuschange en xml
  • EditText: Evita concentrarte en setText ()
  • OnFocusChange no siempre funciona
  • Eliminación del indicador de foco de RecycleView en Android
  • Establecer el área de enfoque de la cámara en Android
  • SearchView quita la línea de enfoque azul y muestra el cursor en determinada posición
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.