Manejo de la pila posterior de fragmentos con el cajón de navegación

Estoy implementando el cajón de navegación y funciona bien. Así que estoy llamando fragmento en el clic de cajón de navegación y también está trabajando y más aún estoy llamando a otro fragmento de fragmento de página de inicio y mantener la pila trasera para cada fragmento, pero el problema es la prensa de vuelta desde el fragmento de niño no puedo ir a Fragmento de página de inicio y acaba de salir de la aplicación. No quiero esto. Lo que quiero Haga clic en

Navigation Drawer->HomePageFragment->AnotherChild Fragment(On List Item click of HomePageFragment) 

Pero en la parte posterior presionada sin ir al fragmento de la Homepage su salida directa con la aplicación. Aquí está mi código: (In Fragment Activity with Navigation Drawer)

 class SlideitemListener implements ListView.OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { updateDisplay(position); } } private void updateDisplay(int position) { Fragment fragment = null; switch (position) { case 0: fragment = new ScheduleFragment(); break; case 1: fragment = new Result_Fragment(); break; case 2: fragment = new Live_Match_Fragment(); break; case 3: // fragment = new Live_Match_Fragment(); break; case 4: fragment = new Team_Fragment(); break; default: break; } if (fragment != null) { fragmentManager = getFragmentManager(); fragmentManager.popBackStackImmediate("0", 0); int count = fragmentManager.getBackStackEntryCount(); FragmentTransaction fragmentTransaction = fragmentManager .beginTransaction(); fragmentTransaction.replace(R.id.frame_container, fragment) .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) .addToBackStack(String.valueOf(count)).commit(); Log.e("Count in Activiy", ""+count); // update selected item and title, then close the drawer setTitle(menutitles[position]); mDrawerLayout.closeDrawer(mDrawerList); } else { // error in creating fragment Log.e("MainActivity", "Error in creating fragment"); } } 

Ahora en BackPressed() en FragmentActivity .

 @Override public void onBackPressed() { if (fragmentManager.getBackStackEntryCount() <= 1) { finish(); return; } super.onBackPressed(); } 

Ahora llamando a otro fragmento secundario del fragmento de HomePage en el elemento Listview , haga clic en.

  team_lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub TeamDetailFragment myDetailFragment = new TeamDetailFragment(); FragmentManager fragmentManager = getFragmentManager(); int count = fragmentManager.getBackStackEntryCount(); Log.e("Count in Fragment", "" + count); FragmentTransaction fragmentTransaction = fragmentManager .beginTransaction(); fragmentTransaction .replace(R.id.frame_container, myDetailFragment) .setTransition( FragmentTransaction.TRANSIT_FRAGMENT_OPEN) .addToBackStack(String.valueOf(count)).commit(); } }); 

Así que cualquiera sabe que me ayude. La ayuda será apreciada.

He creado una aplicación de ejemplo en GitHub para resolver tu problema.

Descargar la aplicación Fragment Back Stack

Hay un problema con fragmentos anidados en android https://code.google.com/p/android/issues/detail?id=40323

Android no maneja la prensa posterior bien si las transacciones estaban en fragmentos anidados. Para superar esto, estoy usando la siguiente corrección dentro de Mi Actividad

 @Override public void onBackPressed() { // If the fragment exists and has some back-stack entry if (myFragment != null && myFragment.getChildFragmentManager().getBackStackEntryCount() > 0) { // Get the fragment fragment manager - and pop the backstack myFragment.getChildFragmentManager().popBackStack(); } // Else, nothing in the direct fragment back stack else { // Let super handle the back press super.onBackPressed(); } } 

He resuelto de la siguiente manera:

1ª solución

 @Override public void onBackPressed() { FragmentManager fragmentManager = getFragmentManager(); int backCount = fragmentManager.getBackStackEntryCount(); if(backCount > 1) { super.onBackPressed(); } else { finish(); } } 

2ª solución

 @Override public void onBackStackChanged() { FragmentManager fragmentManager = getFragmentManager(); int backCount = fragmentManager.getBackStackEntryCount(); if(backCount == 0) { finish(); } } 

Éstos le permiten explotar la pila de Android cuando reemplaza su fragmento:

 FragmentManager fragmentManager = getFragmentManager(); fragmentManager.beginTransaction().replace(R.id.content_frame, yourFragment) .addToBackStack(null).commit(); 

Cuando presione el botón de regreso dentro de su fragmento método onBackPressed () de su actividad se llamará si ha declarado que .. Así que el manejo de botón de nuevo para los fragmentos en el cajón de navegación puede ser uno de esta manera.

Actividad principal

  public static boolean isMainActivityShown ; public static boolean isFragment1Shown=false ; public static boolean isFragment2Shown=false ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); isMainActivityShown=true //inside onCreate method put isMainActivityShown true . . . { Fragment currentFragment = new Fragment1(); isMainActivityShown=false; //when moving to fragment1 isFragment1Shown=true; frgManager = getFragmentManager(); frgManager.beginTransaction().replace(R.id.content_frame, currentFragment) .commit(); } . . } @Override public void onBackPressed() { if(isMainActivityShown) { finish(); } else if(isFragment1Shown) { //write the code to handle back button when you are in Fragment1 } else if(isFragment2Shown) { //When you are in Fragment 2 pressing back button will move to fragment1 Fragment currentFragment = new Fragment1(); isFragment2Shown=false; isFragment1Shown=true; FragmentManager frgManager; frgManager = getFragmentManager(); frgManager.beginTransaction().replace(R.id.content_frame, currentFragment) .commit(); } } 

Fragmento1

 Fragment currentFragment = new Fragment2(); MainActivity.isFragment1Shown=false; MainActivity.isFragment2Shown=true; frgManager = getFragmentManager(); frgManager.beginTransaction().replace(R.id.content_frame, currentFragment) .commit(); 

Ahora puede reemplazar finish () por fragmentManager.popBackStack (), método de android.support.v4.app.FragmentManager

  • Los elementos de RecyclerView desaparecen después de cambiar entre fragmentos
  • Fragmento de Android La transacción con animación provoca que el flash blanco
  • No se pudo encontrar la clase 'android.widget.ThemedSpinnerAdapter'
  • Receptor de radiodifusión dinámica en fragmento
  • Manejar la tecla de retroceso cuando el último fragmento se disparó
  • Mostrar un RecyclerView en Fragmento
  • ¿Es posible incluir un Fragmento en un diseño de método de entrada?
  • FragmentPagerAdapter dentro de Fragment
  • Cómo desencadenar onListItemClick en un ListFragment
  • Uso de `onPrepareOptionsMenu ()` en Android 3.0+
  • ViewPager en blanco en la parte posterior de otro fragmento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.