后退button即使在使用FragmentTransaction.addToBackStack()

没有其他的问题,我已经阅读了stackoverflow已经能够帮助我的问题。 据我所知,我正在做的一切正确。

我有一个带有碎片的主/细节stream。

在创build主要活动时,主片段使用以下代码加载:

Fragment frag; frag = new MainListFragment();//<-- **the master fragment** FragmentManager fm = getFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); transaction.replace(R.id.fragment_container, frag); Log.d("My Debug Bitches", "stack:" + fm.getBackStackEntryCount()); transaction.commit(); 

主片段有一个ListView ; 点击一个列表项就会显示如下细节片段:

 @Override public void onListItemClick(ListView listView, View view, int position, long id) { super.onListItemClick(listView, view, position, id); FragmentManager fm = getFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); SubListFragment frag = new SubListFragment();//<-- **the detail fragment** transaction.replace(R.id.fragment_container, frag); transaction.addToBackStack(null); transaction.commit(); fm.executePendingTransactions(); Log.d("My Debug Bitches", "stack:" + fm.getBackStackEntryCount()); } 

现在,根据LogCat,在从主片段导航到详细片段后, BackStackEntryCount 从0变为1在这里输入图像说明

那么为什么当我在细节片段中单击后退button时,应用程序closures而不是返回到主片段??????????

Solutions Collecting From Web of "后退button即使在使用FragmentTransaction.addToBackStack()"

您必须将popBackStack()调用添加到活动的onBackPressed()方法。

例如:

 @Override public void onBackPressed() { if (fragmentManager.getBackStackEntryCount() > 0) { fragmentManager.popBackStack(); } else { super.onBackPressed(); } } 

@ Bobbake4的答案很棒,但是有一个小问题。 假设我有三个片段A,B和C.A是主片段(当我启动我的应用时显示的片段),B和C是我可以从导航抽屉或从A导航到片段。现在,当我使用B或C的后退button,我会回到前一个片段(A),但前一个片段(片段B或C)的标题现在显示在片段A的actionBar标题中。我必须按回button再次“真正”完成后退导航(显示片段的视图和正确标题并返回)

这就是我解决这个问题的方法。 声明这些variables。

  public static boolean IS_FRAG_A_SHOWN = false; public static boolean IS_FRAG_B_SHOWN = false; public static boolean IS_FRAG_C_SHOWN = false; 

在处理导航抽屉方法的应用程序的MainActivity中,我有一个方法displayView(position)来处理我的碎片的切换。

 private void displayView(int position) { IS_FRAG_A_SHOWN = false; IS_FRAG_B_SHOWN = false; IS_FRAG_C_SHOWN = false; // update the main content by replacing fragments Fragment fragment = null; switch (position) { case 0: fragment = new FragmentA(); IS_FRAG_A_SHOWN = true; break; case 1: fragment = new FragmentB(); IS_FRAG_B_SHOWN = true; break; case 2: fragment = new FragmentC(); IS_FRAG_C_SHOWN = true; break; default: break; } 

最后,在我的onBackPressed方法中,我这样做:

 public void onBackPressed() { if(fragmentManager.getBackStackEntryCount() != 0) { fragmentManager.popBackStack(); if (IS_FRAG_A_SHOWN) { //If we are in fragment A when we press the back button, finish is called to exit finish(); } else { displayView(0); //else, switch to fragment A } } else { super.onBackPressed(); } }