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.

Error de cierre al usar fragmento en la vista de Android utilizando Compose.

Estoy experimentando con Compose e intenté incluir un fragment dentro de un AndroidView en Compose.

Entonces, en mi situación, tenemos un AFragment con un ComposeView y dentro del ComposeView hay un AndroidView que crea un FragmentContainerView y agrega un PIFragment.

Todo funcionaba bien, pero cuando publicamos este código en producción, vimos un fallo en Firebase:

java.lang.IllegalArgumentException: No se encontró la vista con el id 0x7f0b072b (…:id/pFIC) para el fragmento PIFragment{ef1f89b} (bdbe15f0-679d-41bb-8a27-367655f73545 id=0x7f0b072b)

a androidx.fragment.app.FragmentStateManager.createView (FragmentStateManager.java: 513)

a androidx.fragment.app.FragmentStateManager.moveToExpectedState (FragmentStateManager.java: 282)

en androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java: 112)

en androidx.fragment.app.FragmentManager.moveToState (FragmentManager.java: 1647)

en androidx.fragment.app.FragmentManager.dispatchStateChange (FragmentManager.java: 3128)

en androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java: 3065)

en androidx.fragment.app.Fragment.performViewCreated (Fragment.java: 2988)

en androidx.fragment.app.FragmentStateManager.createView (FragmentStateManager.java: 546)

a androidx.fragment.app.FragmentStateManager.moveToExpectedState (FragmentStateManager.java: 282)

en androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java: 2180)

en androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java: 2100)

en androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java: 2002)

en androidx.fragment.app.FragmentManager $ 5.run (FragmentManager.java: 524)

en android.os.Handler.handleCallback (Handler.java: 873)

en android.os.Handler.dispatchMessage (Handler.java: 99)

en android.os.Looper.loop (Looper.java: 193)

en android.app.ActivityThread.main (ActivityThread.java: 6669)

en java.lang.reflect.Method.invoke (Method.java: Nativo)

en com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java: 493)

en com.android.internal.os.ZygoteInit.main (ZygoteInit.java: 858)

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que no se encontró ninguna vista para el fragmento con el id 0x7f0b072b, que es el id del FragmentContainerView dentro de AndroidView. Esto significa que FragmentManager no pudo encontrar la vista para adjuntar el PIFragment.

    Una posible razón para este problema es que FragmentContainerView aún no está inflado cuando FragmentManager intenta reemplazarlo con el PIFragment. Para solucionar este problema, puede intentar posponer la transacción hasta que FragmentContainerView esté listo.

    Aquí hay una versión actualizada del código con una transacción diferida:

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
    ): View {
        return ComposeView(requireContext()).apply {
            setContent {
                AppTheme {
                    GalleryScreen(
                        factory = viewModelFactory,
                        remoteConfig = remoteConfig,
                        id = id,
                        currentPosition = currentPositionState,
                        onBack = { router.back(requireActivity()) },
                    ) {
                        AndroidView(
                            modifier = Modifier
                                .fillMaxWidth()
                                .wrapContentHeight(),
                            factory = {
                                FragmentContainerView(context).apply {
                                    id = R.id.pFIC
                                    // Transacción diferida hasta que FragmentContainerView esté listo
                                    viewTreeObserver.addOnGlobalLayoutListener(
                                        object : ViewTreeObserver.OnGlobalLayoutListener {
                                            override fun onGlobalLayout() {
                                                childFragmentManager.beginTransaction().replace(
                                                    id,
                                                    PIFragment::class.java,
                                                    buildArguments(
                                                        id = id,
                                                        origin = origin,
                                                    ), null
                                                ).commitAllowingStateLoss()
                                                viewTreeObserver.removeOnGlobalLayoutListener(this)
                                            }
                                        })
                                }
                            },
                            update = {},
                        )
                    }
                }
            }
        }
    }
    

    En esta versión, agregamos un ViewTreeObserver a la vista de FragmentContainerView y esperamos hasta que esté inflado antes de iniciar la transacción para reemplazarlo con el PIFragment. Una vez que se activa el ViewTreeObserver, lo eliminamos para evitar cualquier llamada de retorno innecesaria.

    Esto debería asegurarse de que FragmentContainerView esté listo antes de intentar reemplazarlo con el PIFragment, lo que debería solucionar el problema de la falla.

Comments are closed.