Android FragmentTransaction commit ¿Cuándo?
Estoy construyendo una aplicación de tableta. En esta aplicación hay una actividad con dos fragmentos. El primer fragmento es un fragmento de lista "conocido" que muestra una simple lista de disposición de un elemento desde una consulta de base de datos, el segundo fragmento muestra los detalles del registro seleccionado (del fragmento de lista). El pensar con el segundo fragmento es que su tipo depende de los registros que se muestran en la lista. Por ejemplo, si los registros son clientes, se muestran los detalles del cliente seleccionado, si son elementos de inventario se muestran los detalles del elemento seleccionado, etc. Para poder comunicar con el fragmento de detalles he creado una interfaz que cada clase de fragmento de detalle implementa. El fragmento de lista está "fijo" en la actividad desde el layout xml. Sin embargo, el fragmento de detalle se crea durante la creación de la actividad de la siguiente manera:
super.onCreate(savedInstanceState); setContentView(R.layout.act_hlpfiles_host); ..... FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.add(R.id.laydetailsfragment, FragmentsPool.getHelperFileFragment(501), "recordDetails"); fragmentTransaction.commit(); myDetailsFragment = getFragmentManager().findFragmentByTag("recordDetails"); ... myListFragment = (frg_hlpfiles_lstrecords) getFragmentManager().findFragmentById(R.id.frg_lstrecords); .... }
El problema con este código es que myDetailsFragment siempre es nulo. Esto se debe a que el fragmentTransaction.commit () no se ejecuta inmediatamente, pero sucede en el subproceso principal la próxima vez que el subproceso está listo (como indica la documentación de android).
- Android - Establecer id de fragmento
- Android: la animación personalizada en la transacción de fragmentos no se está ejecutando
- Cómo utilizar diferentes onKeyDown en fragmento de una misma actividad
- 'TAG' tiene acceso privado en 'android.support.v4.app.FragmentActivity'
- Mange BackStackEntries en FragmentManager
Si creo el fragmento de detalle en onStart () y instanciar el fragmento de lista en onCreate todo funciona bien.
Así que la pregunta es: ¿Cómo puedo estar seguro de que el fragmentTransaction.commit () ha confirmar la transacción para poder hacer algún trabajo con el fragmento añadido? Además, ¿hay alguna manera de esperar hasta que ocurra el commit y luego continuar con el resto del código?
Gracias por tu tiempo y esfuerzo,
Christos
- FindFragmentById devuelve siempre null
- Menú en Fragmentos no mostrados
- Siempre use v4 Fragments en lugar de la build-in android.app.Fragment?
- OnCreate llamado después onActivityResult cuando elijo la imagen de la galería
- No se puede establecer la propiedad en un fragmento con varias instancias
- Android: el paquete savedInstanceState es null en Fragment onCreate () y onCreateView ()
- RunTimeException en PreferenceFragment
- Problema extraño que refresca ViewPager con nuevo contenido:
Intente ejecutar fragmentManager.executePendingTransactions()
después de confirmar su transacción pero antes de buscar por etiqueta y ver si funciona para usted.
En la API de Android 24 FragmentTransaction
tiene el método .commitNow()
síncrono. Está en la referencia ahora: https://developer.android.com/reference/android/app/FragmentTransaction.html#commitNow ()
Por el contrario, .commit()
funciona de forma asíncrona. Sólo programa un commit de la transacción.
"…. así que puedo hacer algún trabajo con el fragmento añadido ? Además, ¿hay alguna manera de esperar hasta que ocurra el commit y luego continuar con el resto del código ?"
Todo depende del trabajo que quieras hacer. De su pregunta veo que la mayor parte de su código de trabajo debe estar en su código de fragmento de todos modos, por ejemplo, cuando un elemento de inventario está seleccionado.
En la devolución de llamada cuando se selecciona un elemento de lista de selección (con el fin de cambiar el fragmento de detalles), podrá obtener el fragmento de los detalles lo suficientemente cómodo de todos modos.
Además, ya tiene el fragmento de la devolución de FragmentsPool.getHelperFileFragment(501),
por lo que no veo por qué necesita obtener el fragmento a través de su etiqueta.
Estoy interesado en saber qué trabajo necesitas hacer en onCreate
con tu fragmento de detalles añadidos.
- ¿Cómo iniciarForeground () sin mostrar notificación?
- ¿Actualización de esquema GreenDAO y migración de datos?