es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El SearchView de Android se vuelve a enfocar al regresar desde otro fragmento.

Actualmente estoy utilizando la navegación de Jetpack y quiero utilizar una única actividad. Sin embargo, el searchview sigue recuperando el enfoque cuando regreso desde los detalles de la tarjeta a la búsqueda, a pesar de haber eliminado el enfoque después de hacer clic en buscar. Ver aquí.

Lo que estoy haciendo actualmente para eliminar el enfoque es tener una vista simulada sobre mi barra de herramientas:

<com.google.android.material.appbar.MaterialToolbar
    android:id="@+id/database_toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_constraintTop_toTopOf="parent"
    style="@style/Widget.MaterialComponents.Toolbar.Primary" />
<!-- Vista simulada para recibir el enfoque después de que SearchView pierda el enfoque -->
<View
    android:id="@+id/focus_dummy_view"
    android:focusableInTouchMode="true"
    android:focusable="true"
    android:background="@android:color/transparent"
    android:layout_width="match_parent"
    android:layout_height="1dp"
    app:layout_constraintBottom_toTopOf="@id/database_toolbar" />

Después de realizar una búsqueda, hago lo siguiente:

searchView.clearFocus()
binding.focusDummyView.requestFocus()

Mi solución alternativa actual es alojar los detalles en una actividad, pero preferiría no hacerlo. Creé un nuevo proyecto y aún veo que ocurre este problema.

Algunos detalles adicionales son que esto solo ocurrió después de actualizar a "androidx.fragment:fragment-ktx:1.4.0" desde 1.2.5. He informado este problema en el rastreador de errores, pero aún no han respondido. ¿Alguien sabe cómo solucionarlo?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución para el problema de recuperación de enfoque en searchview en la navegación de Android Jetpack

    Si estás utilizando la navegación de Jetpack y te enfrentas al problema de que searchview recupera el enfoque cada vez que regresas de los detalles de la tarjeta a la búsqueda, incluso después de que hayas quitado el enfoque después de hacer clic en buscar, entonces la siguiente solución podría funcionar.

    Actualmente, es posible que estés utilizando una vista ficticia sobre tu barra de herramientas para recibir el enfoque después de que SearchView borre el enfoque. Después de realizar una búsqueda, estás utilizando el siguiente código para quitar el enfoque de SearchView.

    searchView.clearFocus()
    binding.focusDummyView.requestFocus()
    

    Para solucionar este problema, puedes intentar el siguiente truco.

    1. Establece un listener onActionViewCollapsed() para el SearchView.
    searchView.setOnQueryTextFocusChangeListener { _, hasFocus ->
        if (!hasFocus) {
            searchView.onActionViewCollapsed()
        }
    }
    
    1. Devuelve true desde el listener onQueryTextFocusChange().
    searchView.setOnQueryTextFocusChangeListener { _, hasFocus ->
        if (!hasFocus) {
            searchView.onActionViewCollapsed()
        }
        return@setOnQueryTextFocusChangeListener true
    }
    

    Al hacer esto, el SearchView se colapsará al cambiar el enfoque, lo que eliminará el enfoque de él. Esto evitará que recupere el enfoque cuando regreses a la pantalla de búsqueda.

    Esta solución ha funcionado para algunos usuarios y podría ser un truco temporario hasta que se resuelva el problema de la navegación de Jetpack.

Comments are closed.