Обработка стека фрагментов с помощью навигационного ящика

Я внедряю навигационный ящик и хорошо работаю. Таким образом, я вызываю фрагмент на щелчке на панели навигации, и он также работает, и еще больше я вызываю другой фрагмент из фрагмента домашней страницы и поддерживаю задний стек для каждого фрагмента, но проблема снова нажимается на дочерний фрагмент, я не могу перейти к Фрагмент домашней страницы и только что вышел из приложения. Я не хочу этого. Что я хочу Нажмите на

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

Но на спине нажата, не переходя к фрагменту « Homepage его прямой выход с приложением. Вот мой код: (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"); } } 

Теперь в BackPressed() в FragmentActivity .

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

Теперь вызов другого дочернего фрагмента из фрагмента Listview элементе Listview .

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

Значит, тогда кто-нибудь знает меня. Помощь будет оценена.

Solutions Collecting From Web of "Обработка стека фрагментов с помощью навигационного ящика"

Я создал образец приложения на GitHub для решения вашей проблемы.

Загрузить приложение Fragment Back Stack

Существует проблема с вложенными фрагментами в android https://code.google.com/p/android/issues/detail?id=40323

Android не справляется с обратным нажатием, если транзакции были во вложенных фрагментах. Чтобы превзойти это, я использую следующее исправление внутри My Activity

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

Я решил следующее:

1-е решение

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

2-е решение

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

Они позволяют использовать стек Android при замене фрагмента:

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

Когда вы нажмете кнопку «Назад» внутри вашего фрагмента, метод onBackPressed () вашей активности будет вызываться, если вы заявили, что … Так что обратная кнопка для фрагментов в навигационном ящике может быть таким образом.

MainActvity

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

Fragment1

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

Теперь вы можете заменить finish () для fragmentManager.popBackStack (), метод android.support.v4.app.FragmentManager