2013-05-15 72 views
11

我有一個疑難問題,我無法在任何地方找到解決方案。addToBackStack不起作用,關閉活動而不是彈出碎片

當我按下後退按鈕時,我的應用程序不會返回到上一個片段,而是關閉活動。

我有一個活動,顯示4片段:[1],[2],[3],[4]。我可以在動作欄之間切換前3個片段,我不想將它們添加到後端堆棧。

片段[4]是在片段[3]中選擇的項目的詳細視圖。當我按[4]時,我想返回片段[3],而不是關閉應用程序。

的過渡以這種方式由活動,其中片段放置完成:

private void replaceFragment(Fragment fragment, boolean toBackStack){ 

    if(fragment != null){ 

     FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); 
     fragmentTransaction.replace(R.id.container, fragment); 

     if(toBackStack) 
      fragmentTransaction.addToBackStack(null); 

     fragmentTransaction.commit(); 
    } 
} 

其中toBackStack是除了當過渡是從始終爲假[3]〜[4]。

如果我在每個轉換中都傳遞給BackStack爲true,則該活動無論如何都會關閉。

回答

17

我有同樣的問題。具體來說,我正在實現一個PreferenceFragment,並且我希望後退按鈕將我返回到之前加載的片段。

看來,「回棧」的東西是不會自動與系統後退按鈕觸發。我的解決辦法是手動彈出從後退堆棧onBackPressed覆蓋:

@Override 
public void onBackPressed() 
{ 
    if (inSettings) 
    { 
     backFromSettingsFragment(); 
     return; 
    } 
    super.onBackPressed(); 
} 

每當我瀏覽到我的喜好片段,我設置了inSettings布爾爲true活動,以保持該狀態。這裏是我的backFromSettingsFragment方法是這樣的:

private void backFromSettingsFragment() 
{ 
    inSettings = false; 
    getFragmentManager().popBackStack(); 
} 

所以,如果你能夠跟蹤當你在片段的狀態[4]和攔截返回按鈕,你應該能夠手動調用

getFragmentManager().popBackStack(); 

回到Fragment [3]。

注:請記住,你需要添加片段[3]後退堆棧,片段[4]。 (除非[4]去[5],你也需要回到[4]。)

+3

因此,而不是在活動中保持狀態,它可能會更好地做到這一點onBackPressed() if(getFragmentManager ().getBackStackEntryCount()> 0) getFragmentManager()。popBackStack(); – toidiu