Saltar al contenido

¿Cómo ocultar el teclado virtual en Android después de hacer clic fuera de EditText?

Entiende el código correctamente previamente a adaptarlo a tu trabajo si tquieres aportar algo puedes dejarlo en los comentarios.

Solución:

El siguiente fragmento simplemente oculta el teclado:

public static void hideSoftKeyboard(Activity activity) 
    InputMethodManager inputMethodManager = 
        (InputMethodManager) activity.getSystemService(
            Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(
        activity.getCurrentFocus().getWindowToken(), 0);

Puede colocar esto en una clase de utilidad, o si lo está definiendo dentro de una actividad, evite el parámetro de actividad o llame hideSoftKeyboard(this).

La parte más complicada es cuándo llamarlo. Puede escribir un método que itere a través de cada View en tu actividad, y comprueba si es un instanceof EditText si no es registrar un setOnTouchListener a ese componente y todo caerá en su lugar. En caso de que se esté preguntando cómo hacerlo, de hecho es bastante simple. Esto es lo que hace, escribe un método recursivo como el siguiente, de hecho, puede usarlo para hacer cualquier cosa, como configurar tipos de letra personalizados, etc. Aquí está el método

public void setupUI(View view) 

    // Set up touch listener for non-text box views to hide keyboard.
    if (!(view instanceof EditText)) 
        view.setOnTouchListener(new OnTouchListener() 
            public boolean onTouch(View v, MotionEvent event) 
                hideSoftKeyboard(MyActivity.this);
                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);
        
    

Eso es todo, simplemente llame a este método después de usted. setContentView en tu actividad. En caso de que se esté preguntando qué parámetro pasaría, es el id del contenedor principal. Asignar un id a su contenedor principal como

...

y llama setupUI(findViewById(R.id.parent))eso es todo.

Si desea usar esto de manera efectiva, puede crear una extensión Activity y coloque este método, y haga que todas las demás actividades en su aplicación extiendan esta actividad y llamen a su setupUI() en el onCreate() método.

Espero eso ayude.

Si usa más de 1 actividad, defina una identificación común para el diseño principal como
...

Luego extienda una clase de Activity y definir setupUI(findViewById(R.id.main_parent)) dentro de su OnResume() y extender esta clase en lugar de ``Actividadin your program


Aquí hay una versión de Kotlin de la función anterior:

@file:JvmName("KeyboardUtils")

fun Activity.hideSoftKeyboard() 
    currentFocus?.let 
        val inputMethodManager = ContextCompat.getSystemService(this, InputMethodManager::class.java)!!
        inputMethodManager.hideSoftInputFromWindow(it.windowToken, 0)
    

Puede lograr esto siguiendo los siguientes pasos:

  1. Haga que la vista principal (vista de contenido de su actividad) se pueda hacer clic y enfocar agregando lo siguiente attributes

        android:clickable="true" 
        android:focusableInTouchMode="true" 
    
  2. Implementar un método hideKeyboard()

        public void hideKeyboard(View view) 
            InputMethodManager inputMethodManager =(InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
        
    
  3. Por último, configure el onFocusChangeListener de su texto de edición.

        edittext.setOnFocusChangeListener(new View.OnFocusChangeListener() 
            @Override
            public void onFocusChange(View v, boolean hasFocus) 
                if (!hasFocus) 
                    hideKeyboard(v);
                
            
        );
    

Como se indica en uno de los comentarios a continuación, esto podría no funcionar si la vista principal es ScrollView. Para tal caso, el InTouchMode en el que se puede hacer clic y enfocar se puede agregar en la vista directamente debajo de ScrollView.

Simplemente anule el siguiente código en Actividad

 @Override
public boolean dispatchTouchEvent(MotionEvent ev) 
    if (getCurrentFocus() != null) 
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
    
    return super.dispatchTouchEvent(ev);

ACTUALIZAR:

En caso de que alguien necesite la versión Kotlin de esta respuesta:

override fun dispatchTouchEvent(ev: MotionEvent?): Boolean 
    if (currentFocus != null) 
        val imm: InputMethodManager =
            getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(currentFocus!!.windowToken, 0)
    
    return super.dispatchTouchEvent(ev)

valoraciones y reseñas

Puedes añadir valor a nuestra información cooperando tu experiencia en las interpretaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *