2014-09-19 98 views
14

我遇到一个奇怪的问题,同时使用Fragments并弹出它们。Fragment PopBackStack

我有一个片段活动:

第一步:我在名为片段A的启动将一个片段,该活动的OnCreate为:

这是片段的的onCreate活动

@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之后我已添加替换片段用下面的代码:

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

第3步:在那之后,我再次以同样的方式增加了一个片段上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回来,它给了我以前的片段成功,如上所述BackPressed,它会弹出窗口并将我带到以前的片段。但是从Fragment_More,当我再次按下时,它会显示空白的FRAGMENT内容。它从不显示我在活动的OnCreate的第1步添加的第一个片段。

请评论。我做错了什么?

感谢

+0

您能否为我们提供您使用的片段的片段类? – 2014-09-22 13:56:29

+0

我实际上看不到任何错误,实际上我已经复制了你描述的内容(尽可能多),它工作正常。我猜你的代码中有些东西没有显示出来..我注意到你正在改变另一个片段内的活动片段,这可能导致麻烦(你可能想要考虑从你的活动中使用一个监听器)。 – 2014-09-23 09:19:17

+0

检查这个http://stackoverflow.com/questions/32132623/onback-pressed-data-not-showing-in-fragments – 2016-01-04 10:56:29

回答

38

你应该不是你的第一个片段添加到堆栈中,短按返回键将只是扭转你做的动作。因此,如果您替换一个片段,然后向后按,它会逆转您所做的替换。但是如果你按下'.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(); 
    } 

例:

所以我们可以说你有两个片段称为一个 &

如果.add()片段一个页面,而 “addToBackStack()”( =保存动作的反向)您将保存REMOVE片段A作为您单击后退时的操作。

如果.replace()片段一个通过片段,也“addToBackStack()”你会保存在删除并添加一个当你点击后面的动作。

所以,你明白为什么把你的第一个fragmenttransaction添加到backstack并不好?这会导致删除片段A后退,导致空白页。希望这是足够的信息。

此外,一旦您将addToBackStack()删除到您的第一个片段,则不需要覆盖onBackPressed(),因为它可以工作。只有在没有显示空白页面的情况下,堆栈中没有任何内容时,它才会完成活动。

0

您使用此 manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();

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

让我知道它是否适合ü

+0

不,它没有帮助 – 2014-09-19 12:11:19

+0

你能试试我的答案@GauravArora? – Chris 2014-09-19 12:48:00

+0

是的,我曾试过,只有我回复了你 – 2014-09-22 05:12:41

2

你行:

if(fm.getBackStackEntryCount() > 1){ 

应该是:

if (fm.getBackStackEntryCount() > 0) { 

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