2014-04-04 45 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