碎片PopBackStack

我遇到一个奇怪的问题,同时使用Fragments并将其popup。

我有一个片段活动:

第一步:我在起始名为Fragment A的Activity的onCreate中附加一个Fragment,如下所示:

这是片段活动的创造

@Override protected void onCreate(Bundle savedBundleState) { super.onCreate(savedBundleState); setContentView(R.layout.activity_base_new); Fragement_Home home = new Fragement_Home(); FragmentManager manager = getSupportFragmentManager(); manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit(); } 

步骤:2之后,我附上用下面的代码replace了片段:

 Fragment_More moreFragment = new Fragment_More(); FragmentManager manager = getSupportFragmentManager(); manager.beginTransaction().replace(R.id.frameContent, moreFragment).addToBackStack("more").commit(); 

第三步:在那之后,我再以同样的方式在Fragment_More上添加一个片段:

 Fragment_AboutRockstand termsConditions = new Fragment_AboutRockstand(); getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.frameContent, termsConditions).addToBackStack("about_rockstand").commit(); 

这里是我的片段的活动onBackPressedButton Lisetener:

 @Override public void onBackPressed() { FragmentManager fm = getSupportFragmentManager(); Fragment f = fm.findFragmentById(R.id.frameContent); if(fm.getBackStackEntryCount() > 1){ fm.popBackStack(); } else{ finish(); } } 

这是我得到的问题:

当我从第3步按回来时,它按照onBackPressed的描述成功地给了我以前的片段,它将会popup并将我带到前一个片段。 但从Fragment_More,当我再次按下,它显示我空白FRAGMENT内容。 它从不显示我在活动的OnCreate的第1步中添加的第一个片段。

请给出意见。 我做错了什么?

谢谢

Solutions Collecting From Web of "碎片PopBackStack"

你不应该把你的第一个片段join到后台,因为按下回车键就会扭转你所做的动作。 所以,如果你replace一个片段,然后按回来,它将会逆转你所做的replace。 但是如果你按下一个' .add() '分片交易,它只会将其删除并显示一个空白页面。 所以我认为从后台堆栈中删除第一个片段应该能够解决这个问题。 试试看,让我知道!

 @Override protected void onCreate(Bundle savedBundleState) { super.onCreate(savedBundleState); setContentView(R.layout.activity_base_new); Fragement_Home home = new Fragement_Home(); FragmentManager manager = getSupportFragmentManager(); manager.beginTransaction().add(R.id.frameContent, home).commit(); } 

例:

所以我们假设你有两个片段叫做AB

如果将.add()分段A添加到页面中,并且“ addToBackStack() ”(=保存操作的反向),则您将单击后退时将REMOVE片段A保存为操作。

如果.replace()通过片段B片段A ,还有“ addToBackStack() ”,您将保存删除B并添加A作为操作,当你点击回来。

所以你明白为什么把你的第一个碎片交易添加到后台堆栈是不好的做法? 这只会导致删除片段A后退,导致一个空白页面。 希望这是足够的信息。

另外,一旦你将addToBackStack()移除到你的第一个片段中,你就不需要重写onBackPressed()因为它可以工作。 在没有任何显示空白页面的情况下,只有当后台没有任何东西时才会完成活动。

你的路线:

 if(fm.getBackStackEntryCount() > 1){ 

应该:

 if (fm.getBackStackEntryCount() > 0) { 

你在背上放3个碎片。 popup前两个条目后,堆栈上的条目计数等于1.因此,您可以防止自己检索添加到后台堆栈中的第一个片段。

你正在使用这个manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();

试着用这个代替manager.beginTransaction().replace(R.id.frameContent, home).addToBackStack("home").commit();

让我知道,如果它适用于你