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.

Cómo reemplazar un fragmento en androidx.fragment.app.FragmentContainerView con Android databinding.

Mi aplicación actual de Android utiliza databinding.

Estoy teniendo problemas al intentar agregar un fragmento a un androidx.fragment.app.FragmentContainerView.

Logré obtener el resultado que quería, pero no parece ser el enfoque correcto.

No entiendo dónde he cometido un error.

En mi método onCreate de la actividad, realizo este código para establecer el fragmento requerido.

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

    if (savedInstanceState == null) manageFragment()

}

Donde la función manageFragment() se asemeja a esto.

private fun manageFragment() {
val myFragment = MyFragment.instance()

when {
    (currentFragment == null) -> supportFragmentManager
        .beginTransaction()
        .replace(R.id.my_fragment_container, myFragment)
        .commit()

    (currentFragment is MyFragment) -> doNothing()

    else -> supportFragmentManager
        .beginTransaction()
        .replace(R.id.my_fragment_container, myFragment)
        .commit()
}

}

Cuando verifico después de manageFragment(), este método devuelve nulo en onCreate().

supportFragmentManager.findFragmentById(R.id.my_fragment_container)

Sin embargo, cuando llamo al mismo método en onPostCreate().

override fun onPostCreate(savedInstanceState: Bundle?) {
super.onPostCreate(savedInstanceState)
currentFragment = supportFragmentManager.findFragmentById(R.id.my_fragment_container)
}

Tiene mi fragmento establecido.

¿Es así como debería agregar/reemplazar fragmentos al utilizar databinding?

¿Por qué mi fragmento no se devuelve hasta postCreate()?

Tengo la sensación de que es porque una vez que confirmo la transacción del fragmento para agregar mi fragmento al FragmentContainerView, el diseño todavía necesita ser medido, etc. por lo que “algún tiempo” pasa antes de que findFragmentById() pueda devolver mi fragmento añadido.

¿Hay un listener de diseño que pueda agregar a FragmentContainerView para detectar cuándo mi fragmento se agrega realmente y se vuelve visible?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Respuesta

    No es necesariamente un problema añadir un fragmento a un FragmentContainerView al utilizar data binding. No obstante, el problema de que el fragmento no sea retornado hasta postCreate() puede depender del hecho de que el diseño aún necesita ser medido después de que la transacción del fragmento se haya procesado.

    Un enfoque para detectar cuándo el fragmento es añadido y se vuelve visible consiste en utilizar el método addOnLayoutChangeListener() en el FragmentContainerView. Este método te permite establecer un escuchador que será llamado cuando el diseño de la vista haya cambiado. Puedes verificar si el fragmento añadido es visible en el escuchador y realizar cualquier acción necesaria de acuerdo a ello.

    Por ejemplo, puedes modificar el método onCreate() para añadir el escuchador de cambios de diseño así:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
    
        if (savedInstanceState == null) {
            manageFragment()
            binding.myFragmentContainer.addOnLayoutChangeListener { view, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom ->
                val fragment = supportFragmentManager.findFragmentById(R.id.my_fragment_container)
                if (fragment != null && fragment.isVisible) {
                    // Realizar cualquier acción necesaria para el fragmento visible
                }
            }
        }
    }
    

    De esta manera, el escuchador será añadido cuando la actividad sea creada por primera vez y será llamado cuando el diseño del FragmentContainerView cambie. Una vez que el fragmento sea añadido y se vuelva visible, puedes realizar cualquier acción necesaria dentro del escuchador.

Comments are closed.