2014-04-04 115 views
0

在努力使我的简单片段程序工作后,我还没有找到任何解决方案:我在我的主要活动中管理两个片段:FragmentNeedle和FragmentPlot。一次只能出现一个。用户有两个bottons可以选择他想要显示的片段。此外,当FragmentPlot显示时,用户应该能够通过按回退键导航回FragmentNeedle。这是我的代码:Android:切换片段和Backstack

public void onButtonPlotPressed() 
{ 
    FragmentManager manager = getSupportFragmentManager();  
    mPlotFragment = (PlotFragment) manager.findFragmentByTag(PlotFragment.class.getSimpleName()); 

    if(mPlotFragment == null) 
    { 
     mPlotFragment = new PlotFragment(); 
     FragmentTransaction ft = manager.beginTransaction();    
     ft.replace(R.id.main_layout_center, mPlotFragment, PlotFragment.class.getSimpleName());             
     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);        
     ft.addToBackStack(null); 
     ft.commit();   
     manager.executePendingTransactions(); 
    } 

public void OnButtonNeedlePressed() 
{ 
    FragmentManager manager = getSupportFragmentManager(); 
mFragmentNeedle = (FragmentNeedle) manager.findFragmentByTag(FragmentNeedle.class.getSimpleName()); 


    FragmentTransaction ft = manager.beginTransaction();   
    if(mFragmentNeedle == null) 
    { 
     mFragmentNeedle= new FragmentNeedle(); 

     ft.replace(R.id.main_layout_center, mFragmentNeedle, FragmentNeedle.class.getSimpleName());         
     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);      
     ft.commit();    
     manager.executePendingTransactions(); 
    } 


} 

当显示PlotFragment,我按背,我回到NeedleFragment。但现在,当我尝试通过按UI按钮切换到Plot Fragment时,它将继续显示PlotFragment。如果我删除了ft.addToBackStack()这一行,通过按UI上的按钮,片段之间的切换就可以正常工作,但是我不能用后退键返回。我在做什么错了?

回答

0

您绝不会将您的FragmentNeedle添加到后台。

public void OnButtonNeedlePressed() {  
    mFragmentNeedle = (FragmentNeedle)manager.findFragmentByTag(FragmentNeedle.class.getSimpleName()); 

    if(mFragmentNeedle == null) { 
     FragmentManager manager = getSupportFragmentManager(); 
     mFragmentNeedle= new FragmentNeedle(); 

     ft.replace(R.id.main_layout_center, mFragmentNeedle, FragmentNeedle.class.getSimpleName());         
     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
     //missing line 
     ft.addToBackStack(FragmentNeedle.class.getSimpleName()); 
     ft.commit();    
     manager.executePendingTransactions(); 
    } 
} 
+0

正如我所理解的,您添加回栈堆栈事务而不是片段。我认为这个字符串参数只是该事务的可选名称。没什么区别。所以我需要的是将事务从FragmentNeedle添加到PlotFragment,如果您在提交事务之前保存事务,当您检索backstack时,程序将恢复已保存的事务。 – Cocomico

+0

是的,名称是可选的。我想它是用于getSupportFragmentManager()。popBackStack(String name,int flags);.是的,你添加一个交易不是一个片段。如果你使用add()而不是replace(),FragmentManager将只移除你当前的片段。在你的情况下,FragmentManager将删除你的当前并添加旧的片段。 – Neige