片段addToBackStack()和popBackStackImmediate()不起作用

我目前正在构buildAndroid应用程序(14 <= SDK <= 21)通过使用一个ActionBarActivity和更多Fragments ,如ListFragmentMapFragment ,在一个FrameLayout视图内交换。

ActionBarActivity会自动replace/提交A片段。然后,当用户点击一个button时,托pipeActivity将replace/提交一个新的不同的片段B.我的目标是让用户在按下后退button后立即返回片段A 。

一些代码现在。

主要活动

 public class MainActivity extends ActionBarActivity implements StopFragment.OnFragmentInteractionListener, StopItemFragment.OnFragmentInteractionListener { ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); fragmentManager = getFragmentManager(); fragmentManager.enableDebugLogging(true); ... if (fragmentManager.findFragmentById(R.id.content_frame) == null) { StopItemFragment list = StopItemFragment.newInstance(null); //A - extends ListFragment fragmentManager.beginTransaction() .replace(R.id.content_frame, list) .addToBackStack(null) .commit(); } ... @Override public void onFragmentInteraction(String id) { selectItem(Integer.parseInt(id)); } private void selectItem(int position) { StopFragment fragment = StopFragment.newInstance(null, null); //B - extends Fragment ... fragmentManager.beginTransaction() .replace(R.id.content_frame, fragment) .commit(); ... } } 

问题

即使调用addToBackStack() ,当我在片段B上,我也无法回到片段A. MainActivity直接closures。 然而我试图自己pipe理后面的堆栈,没有运气。 我可以看到片段在堆栈上,但如果我调用popBackStackImmediate() ,则会popup片段A,并且不会执行片段事务。 (第一次按下什么都没有发生,第二次活动closures)

我也附上FragmentManager logcat:
http://pastebin.com/hFLHprL8

Solutions Collecting From Web of "片段addToBackStack()和popBackStackImmediate()不起作用"

对于那些仍在寻找解决scheme的人来说。

在主要的Activity类(托pipe片段)中,只需重写onBackPressed()

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

片段中没有onBackPressed()方法,而这个方法只是针对activity 。 所以,当我们按下后退键时,会显示activity的默认行为,即

您将要么去以前的活动(如果有的话),或者应用程序将退出。

现在我们需要重写这个方法来告诉activity ,当我们按下后退键时,如果有返回堆栈中的任何碎片,将它们popup(这是addToBackStack()进入图片时)。 否则,请按照默认行为。

试试这个(注意,不要replace fragmentA, addToBackStack() replace fragmentB)

 StopItemFragment list = StopItemFragment.newInstance(null); //A - extends ListFragment fragmentManager.beginTransaction() .add(R.id.content_frame, list) .commit(); 

 StopFragment fragment = StopFragment.newInstance(null, null); //B - extends Fragment ... fragmentManager.beginTransaction() .replace(R.id.content_frame, fragment) .addToBackStack("FragmentB") .commit(); 

我不得不手动调用FragmentManager beginTransaction()commit()
通过覆盖onBackPressed()解决:

 @Override public void onBackPressed() { ... if (fragmentManager.getBackStackEntryCount() > 1){ fragmentManager.popBackStackImmediate(); fragmentManager.beginTransaction().commit(); } else { //handle finish finish(); // Closes app } } 

如果你正在用addToBackStack()和popBackStack()挣扎,那么就直接使用

 FragmentTransaction ft =getSupportFragmentManager().beginTransaction(); ft.replace(R.id.content_frame, new HomeFragment(), "Home"); ft.commit();` 

在OnBackPressed()中的Activity中,通过标签查找fargment,然后做你的东西

 Fragment home = getSupportFragmentManager().findFragmentByTag("Home"); if (home instanceof HomeFragment && home.isVisible()) { // do you stuff } 

更多信息https://github.com/DattaHujare/NavigationDrawer我从来没有使用addToBackStack()来处理片段&#x3002;