2012-09-26 52 views
5

我正在開發一個簡單的基於片段的應用程序,帶有單獨的FragmentActivity。應用程序的每個「屏幕」都包含在一個片段中,並且在應用程序啓動時將所有片段添加到容器佈局。Android - 後退按鈕和片段backstack不起作用

// Set up fragments in Main Activity 
fragMan = getFragmentManager(); 
FragmentTransaction ft = fragMan.beginTransaction(); 
ft.add(R.id.fragment_container, settingsFragment); 
ft.add(R.id.fragment_container, mapFragment); 
ft.add(R.id.fragment_container, tracksFragment); 
ft.add(R.id.fragment_container, waypointsFragment); 
ft.commit(); 

轉換是通過隱藏當前可見的片段,然後顯示適當的片段來完成的。

ft = fragMan.beginTransaction(); 
ft.show(mapFragment); 
ft.addToBackStack(null); 
ft.commit(); 

這一切工作正常,但按下後退按鈕時,應用程序退出,無論哪個屏幕是可見的還是什麼以前的交易已被添加到後退堆棧。

我已經檢查過,以確保返回堆棧正確地累積記錄並嘗試過渡方法的許多不同變體,例如替換片段而不是隱藏/顯示它們,創建片段的新實例而不是將它們存儲在變量中,等等。據我所知,我的代碼與我可以找到的所有教程和示例相匹配,而且我甚至還找不到類似的問題/類似問題的例子,這可能是因爲標準實現「適用於」其他。

我懷疑它可能是應用程序級別的問題,例如我的清單中的一個屬性(我已經詳細調查過)或者我的應用程序設置的方式固有的東西,這會阻止後退按鈕正常工作。我可以重寫onBackPressed來手動處理轉換,但這似乎是一個非常醜陋的解決方法。任何想法爲什麼這可能不像預期的那樣行事?順便說一下,這是運行Jelly Bean的Nexus 7。

回答

0

我不確定這是否會解決您的問題,但我不認爲您需要添加所有片段開始。

我也注意到(至少與兼容性庫),替換方法似乎是非常錯誤的,所以最好先刪除現有的片段,然後添加新的。

這裏是代碼位我用它來改變一個片段:

/** 
* Changes the detail fragment of this activity. This is how all content is presented in this app. 
* @param fragment 
* @param animated 
* @param addCurrentFragmentToBackStack 
*/ 
private void changeDetailFragment(Fragment fragment,boolean animated,boolean addCurrentFragmentToBackStack) 
{ 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 

     if (animated) 
      transaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out); 

    Fragment currentFrag = getSupportFragmentManager().findFragmentById(R.id.detailFragment); 


    String fragName = "NONE"; 

    if (currentFrag!=null) 
     fragName = currentFrag.getClass().getSimpleName(); 


    if (currentFrag != null) 
    { 

     transaction.remove(currentFrag); 
    } 


    transaction.add(R.id.detailFragment,fragment); 


    if (addCurrentFragmentToBackStack) 
    { 
     Log.i("APP_NAME","Adding: " + fragName + " to the backstack"); 
     transaction.addToBackStack(null); 
    } 
    else 
    { 
     Log.i("APP_NAME","Not adding: " + fragName + " to the backstack"); 
    } 



    transaction.commit(); 

} 

希望這有助於。

2

檢查您是否使用FragmentActivity(來自支持庫)而不是Activity。這將導致後臺和轉換問題。