android - requisitos - FragmentManager ya está ejecutando transacciones. ¿Cuándo es seguro inicializar el buscapersonas después de la confirmación?
que recibimos en la confirmacion (5)
Si alguien está usando Robolectric> 3.6 y al menos hasta 4.0.2 con un ViewPager, puede ver esto incluso con el código correcto.
Hay información relacionada en este problema de github que rastrea el problema de Robolectric.
El problema no se resuelve mientras escribo esta respuesta, y las únicas soluciones conocidas son usar @Config (sdk = {27}) que parece funcionar para algunos pero no funcionó para mí, o implementar un ViewPagerShadow con una solución en su paquete de prueba con el código bastante largo al que se hace referencia en github (puedo incluirlo aquí si es mejor, pero esto puede no ser lo suficientemente relevante como respuesta?) y usar @Config (sombras = {ShadowViewPager.class})
Tengo una actividad que aloja dos fragmentos. La actividad comienza mostrando un cargador mientras carga un objeto. El objeto cargado se pasa a ambos fragmentos como argumentos a través de métodos newInstance y esos fragmentos se adjuntan.
final FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
trans.replace(R.id.container1, Fragment1.newInstance(loadedObject));
trans.replace(R.id.container2, Fragment2.newInstance(loadedObject));
trans.commit();
El segundo fragmento contiene un android.support.v4.view.ViewPager y pestañas. onResume lo inicializamos como sigue
viewPager.setAdapter(adapter);
viewPager.setOffscreenPageLimit(adapter.getCount()); //the count is always < 4
tabLayout.setupWithViewPager(viewPager);
El problema es Android, luego arroja
java.lang.IllegalStateException: FragmentManager ya está ejecutando transacciones
Con este seguimiento de la pila:
(tomé
android.support
de los nombres de los paquetes solo por brevedad)
v4.app.FragmentManagerImpl.execSingleAction (FragmentManager.java:1620) en v4.app.BackStackRecord.commitNowAllowingStateLoss (BackStackRecord.java:637) en v4.app.FragmentPagerAdapter.finishUpdate (FragmentPagerAdapter.Perview.Aptter.ager) .populate (ViewPager.java:1235) en v4.view.ViewPager.populate (ViewPager.java:1083) en v4.view.ViewPager.setOffscreenPageLimit (ViewPager.java:847)
Los datos muestran si
setOffscreenPageLimit(...);
es removido.
¿Hay otra forma de evitar este problema?
¿Cuándo en el ciclo de vida se completa la transacción del fragmento para que pueda esperar a configurar mi buscapersonas?
Si está apuntando a SDK 24 y superior, puede usar:
FragmentTransaction.commitNow()
en lugar de
commit()
Si está apuntando a versiones anteriores, intente llamar a:
FragmentManager.executePendingTransactions()
después de la llamada a
commit()
Simplemente use
childFragmentManger()
para
viewpager
dentro de un
Fragment
mPagerAdapter = new ScreenSlidePagerAdapter(getChildFragmentManager());
mPager.setAdapter(mPagerAdapter);
Tuve esta excepción al reemplazar rápidamente 2 fragmentos Y usar executePendingTransactions (). Sin llamar a esto no hubo excepción.
¿Cuál fue mi caso? Abro un fragmento A y en su onResume () (bajo una condición) le pido a la actividad que reemplace el fragmento con el fragmento B. En ese momento se produce la excepción.
Mi solución fue usar un Handler.post (ejecutable) que coloca la consulta al final de la cola de subprocesos en lugar de ejecutarla de inmediato. De esta forma nos aseguramos de que la nueva transacción se ejecutará después de que se completen las transacciones anteriores.
Entonces mi solución fue tan simple como:
Handler uiHandler = new Handler();
uiHandler.post(new Runnable()
{
@Override
public void run()
{
openFragmentB(position);
}
});
Tuve un problema similar
Una actividad principal que agrega el fragmento A.
Luego fragmente una actividad de devolución de llamada para reemplazarse con el fragmento B.
MainActivity lanza la excepción "fragmentmanager ya está ejecutando la transacción" cuando reemplaza y confirma la transacción con el fragmento B.
El problema en realidad proviene del fragmento B.
Tengo un TabHost en el fragmento B que requiere getfragmentmanager () para agregar tabfragment.
Reemplace getfragmentmanager () por getchildfragmentmanager () en el fragmento B resuelva el problema.