tutoriales studio programacion libro desarrollador definicion biblia aplicaciones android fragment

studio - manual sqlite android pdf



Fragmento todavía existe después de eliminar? (8)

Estaba teniendo el mismo problema. Quité el fragmento usando la etiqueta de la siguiente manera:

FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction ft = fragmentManager.beginTransaction(); Fragment fragment = fragmentManager.findFragmentByTag("fragment1"); ft.remove(fragment); ft.commit();

Ahora findFragmentByTag() debería devolver null

1 Agrega dos fragmentos a FragmentManager

FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft1 = fm.beginTransaction(); ft1.add(containerId, fragment1, "fragment1"); ft1.addToBackStack(null); ft1.commitAllowingStateLoss(); FragmentTransaction ft2 = fm.beginTransaction(); ft2.add(containerId, fragment2, "fragment2"); ft2.addToBackStack(null); ft2.commitAllowingStateLoss();

2 Cambie la configuración móvil Opciones de desarrollador-> No guardar actividades-> ACTIVADO

3 Eliminar todos los fragmentos después de recrear la actividad

FragmentTransaction ft3 = fm.beginTransaction(); for(Fragment f : fm.getFragments()) ft3.remove(f); ft3.commitAllowingStateLoss();

Mi pregunta es ¿por qué fm.findFragmentByTag ("fragment1") NO es nulo después de eliminar?

minSdkVersion 17 targetSdkVersion 22 compileSdkVersion 22


Prueba este código para eliminar el fragmento.

FragmentManager manager = getActivity().getSupportFragmentManager(); FragmentTransaction trans = manager.beginTransaction(); trans.remove(myFrag); trans.commit(); manager.popBackStack();

creo que no has agregado este método

manager.popBackStack();

o

getSupportFragmentManager().popBackStack()


Prueba esto...

List<Fragment> list = getSupportFragmentManager().getFragments(); if (list == null) { Log.e("TAg", "No existing fragments" ); } for (Fragment frag : list) { // To save any of the fragments, add this check. // A tag can be added as a third parameter to the fragment when you commit it if (frag.getTag().equals("tag-name")) { continue; } getSupportFragmentManager().beginTransaction().remove(frag).commit(); }


Usted debe commit transacciones de eliminación de fragmentos individuales.

este código se confirmará después de completar el bucle

for(Fragment f : fm.getFragments()) ft3.remove(f); ft3.commitAllowingStateLoss();

en lugar de utilizar brackets

for(Fragment f : fm.getFragments()){ ft3.remove(f); ft3.commitAllowingStateLoss(); }


Utilice el método commitNow lugar de commitAllowingStateLoss , ya que realiza la transacción de forma síncrona


en vez de

ft1.add(containerId, fragment1, "fragment1");

tratar

ft1.replace(containerId, fragment1, "fragment1");

y usar el

fragmentmanager.popBackStack();


use popBackStackImmediate() lugar de popBackStack() asegurarse de que el fragmento se elimine de la reserva inmediatamente. El método de eliminación de transection no elimina el fragmento del backstack, solo para la transección.


public void popAll() { if (mFragmentManager != null) { if (!mOnPause && mFragmentManager.getBackStackEntryCount() > 0) { if (isFragmentOnStack(HomeFragment.TAG_NAME)) mFragmentManager.popBackStackImmediate(HomeFragment.TAG_NAME, 0); else mFragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); } else if (mFragmentManager.getBackStackEntryCount() > 0) { mTransactionList.clear(); mTransactionList.add(new FragmentPopAll()); } } }