addToBackStack之后的popBackStack()不起作用

我的项目包含两个片段:

  • FragmentA:应用程序启动时默认加载的片段
  • FragmentB:当点击button完成时replacefragmentA

这是我的主要观点的XML:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:id="@+id/main_fragment_container" android:name="fragmentA" android:layout_width="match_parent" android:layout_height="match_parent"> </fragment> </LinearLayout> 

当我想用FragmentAreplaceFragmentB ,我使用下面的代码:

 FragmentTransaction fragmentTransaction = getSupportFragmentManager() .beginTransaction(); fragmentTransaction.addToBackStack(null); fragmentTransaction.replace(R.id.main_fragment_container, new FragmentB()); fragmentTransaction.commit(); 

这段代码工作正常。 我的片段A被新的FragmentB取代。 但是当点击后退button时,我希望使用popBackStackImmediate()来replaceFragmentB

这是我使用的代码:

 if (getSupportFragmentManager().getBackStackEntryCount() > 0){ boolean done = getFragmentManager().popBackStackImmediate(); fragmentTransaction.commit(); } 

函数popBackStackImmediate返回总是false,而FragmentB仍然在前台。

为什么当我调用popBackStackImmediate时,FragmentA不会replaceFragmentB? 有没有人有解决我的问题的想法?

提前致谢

Related of "addToBackStack之后的popBackStack()不起作用"

您可以使用getSupportedFragmentManager()来通过FragmentBreplaceFragmentB 。 但是你可以在popBackStack()上调用getFragmentManager()

如果您要将碎片添加到android.support.v4.app.FragmentManager ,则还必须在同一个FragmentManager上调用popBackStack()

这段代码应该解决这个问题:

 if (getSupportFragmentManager().getBackStackEntryCount() > 0){ boolean done = getSupportFragmentManager().popBackStackImmediate(); } 

你应该打电话

 fragmentTransaction.addToBackStack(null); 

执行所有操作(如add(),remove()和replace()以及commit()之前)。 只有这个交易将被添加到后台。 只有这样你才能够用Backbutton返回到前一个片段状态。 详情在这里 。

问题是你正在混合来自支持库的Fragment和方法。

如果您正在使用支持库,请确保:

  • 你的Activityandroid.support.v4.app.FragmentActivity扩展
  • 你的Fragmentandroid.support.v4.app.Fragment扩展
  • 使用getSupportFragmentManager()来获取android.support.v4.app.FragmentManager

你在Activity代码是:

 if (getSupportFragmentManager().getBackStackEntryCount() > 0) { getSupportFragmentManager().popBackStackImmediate(); } 

请注意,如果你想从Fragment代码中获得FragmentManager ,你必须使用getFragmentManager方法,正如文档中所解释的(如果你没有太多的经验,这可能是一些混乱的原因)。

如果您不使用支持库:

  • 你的Activityandroid.app.Activity扩展
  • 你的Fragmentandroid.app.Fragment扩展
  • 使用getFragmentManager()来获取android.app.FragmentManager

你的代码是:

 if (getFragmentManager().getBackStackEntryCount() > 0) { getFragmentManager().popBackStackImmediate(); } 

fragmentTransaction.commit(); 在这两种情况下都不是必须的,所以删除它。

此外,请致电fragmentTransaction.addToBackStack(null);commit之前,但在其他操作之后。

我会build议使用带Tag的片段replace来产生相同的结果。

将片段B添加到带有标签的活动

 fragmentTransaction.replace(R.id.main_fragment_container, new FragmentB(),"TAG_B"); 

片段A – >片段B [onBackPressed] – >片段A覆盖活动文件中的onBackPressed(),其中,

//检查片段B,并查看片段B.

 if (getSupportFragmentManager().findFragmentByTag("TAG_B")!=null) { fragmentTransaction.replace(R.id.main_fragment_container, new FragmentA(),"TAG_A"); } 

在创build片段或将片段添加到活动之前,addToBackStack(“TAG”)和popBackStackImmediate(“TAG”)始终恢复为片段条件,而UI中没有任何数据!

如果你正在用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;