android - example - getsupportfragmentmanager
getBackStackEntryCount() siempre devuelve 0 incluso después de agregar addToBackStack y executePendingTransactions() (7)
El problema radica en cómo está agregando y eliminando fragmentos.
Si agrega mediante supportFragmentManager , debe usar supportFragmentManager con backStackEntryCount.
Si usa fragmentManager para agregar, entonces debería usar fragmentManager para obtener la cantidad de fragmentos (backStackEntryCount)
// **Kotlin**
// AddFragment
val ft = supportFragmentManager.beginTransaction()
ft.replace(R.id.activity_base_content, f)
ft.addToBackStack(null)
ft.commit()
// Get amount of fragments
supportFragmentManager.backStackEntryCount
Tengo dos actividades A y B. La actividad A tiene un mapFragment y lo estoy agregando a Backstack. Cuando vuelva a Actvity A de B, quiero que el fragmento aparezca en el mismo estado en que lo dejé. Pero getFragmentManager (). GetBackStackEntryCount () me está devolviendo 0. Aquí está mi código:
MapFragment mMapFragment = MapFragment.newInstance();
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
mMapFragment.getMapAsync(this);
fragmentTransaction.replace(R.id.container, mMapFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
getFragmentManager().executePendingTransactions();
Al regresar de la actividad B, tengo esto para saber el número de getBackStackEntryCount ():
System.out.println("Number of entries in backstack "+ getFragmentManager().getBackStackEntryCount());
que me está mostrando 0.
Gracias por adelantado.
Google ha desaprobado getFragmentManager()
, así que siempre use getSupportFragmentManager()
Compruebe aquí para más información.
Prueba esto:
MapFragment mMapFragment = MapFragment.newInstance();
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
mMapFragment.getMapAsync(this);
fragmentTransaction.add(R.id.container, mMapFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
getFragmentManager().executePendingTransactions();
He cambiado esta línea:
fragmentTransaction.replac(R.id.container, mMapFragment);
a esto:
fragmentTransaction.add(R.id.container, mMapFragment);
Bastante seguro de que si reemplaza un fragmento, entonces no está en el backstack :)
Simplemente reemplace getFragmentManager()
con getSupportFragmentManager()
. Solución simple. Está funcionando para mí. Necesitas hacerlo en tu Actividad.
Tengo otra solución (caminar) para detectar fragmentos, porque en mi ejemplo FM.getBackStackEntryCount () también devolvió 0 y FM.executPendingTransactions no funcionó.
Así que aquí es cómo agrego un nuevo fragmento:
getFragmentManager().beginTransaction()
.add(contextLayout.getId(), toolFragment, FRAG_TOOL_TAG)
.setCustomAnimations(R.anim.tool_frag_in, R.anim.tool_frag_out)
.commit();
Y aquí es cómo lo quito:
Fragment prevTool = getFragmentManager().findFragmentByTag(FRAG_TOOL_TAG);
if(prevTool != null){
getFragmentManager().beginTransaction().remove(prevTool).commit();
}else {
intentCANCELED();
}
Fundada originalmente here .
Tengo un problema similar. Gracias a esta respuesta, creo el siguiente código en mi actividad, en lugar de fragmentos, y esta solución funciona bien:
getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
Log.d("ovech", "back stack changed");
Log.d("ovech", "back stack count = " + getSupportFragmentManager().getBackStackEntryCount());
if(getSupportFragmentManager().getBackStackEntryCount()>0) {
toolbar.setNavigationIcon(R.drawable.ic_arrow_back_white_24dp);
} else {
toolbar.setNavigationIcon(null);
Log.d("ovech", "hello without icon");
}
toolbar.invalidate();
}
});
Tuve un problema similar, en mi caso getFragmentManager().getBackStackEntryCount()
siempre devolvía cero.
Mi problema fue que he usado fragmentos de soporte:
Fragment fragment = new MyFragment();
// note getSupportFragmentManager() instead getFragmentManager()
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.frame, fragment)
.addToBackStack(null)
.commit();
fragmentManager.executePendingTransactions();
y he comprobado getFragmentManager()
backStackEntryCount
, que siempre devuelve cero (está usando otro administrador de fragmentos):
@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() > 0 ) {
getFragmentManager().popBackStack();
}
}
en lugar de getSupportFragmentManager
, que devuelve el número correcto:
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() > 0 ) {
getSupportFragmentManager().popBackStack();
}
}