support getsupportfragmentmanager example commitallowingstateloss app android fragmentmanager

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(); } }