2013-08-19 57 views
6

我希望能夠通過使用addToBackStack()以逆轉replaceFragmentTransaction單擊後退按鈕不執行任何操作

FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction();   
Fragment scheduleFragment = new ScheduleFragment();  
fragmentTransaction.replace(R.id.content_container, scheduleFragment, "scheduleFragment"); 
fragmentTransaction.addToBackStack("scheduleFragment"); 
fragmentTransaction.commit(); 

但在此之後,單擊後退按鈕什麼都不做。

從文檔,它應該扭轉交易。

我錯過了什麼?

+2

[doc](http://developer.android.com/training/implementing-navigation/temporal.html)(請參閱「爲片段實現後退導航」)說使用'.add'而不是'.replace '。 檢查答案在這裏: http://stackoverflow.com/questions/18634207/difference-between-add-replace-and-addtobackstack 但我想'.replace'不完全支持,而.add'似乎工作正確。 – electrocrat

+0

@Abel Paz'下面的答案是與'.replace'問題的正確解決方案。 – electrocrat

回答

4

嘗試fragmentTransaction.addToBackStack(null)addToBackStack()的參數是恢復狀態的可選名稱,你不要在replace()方法,僅僅是片段的可選標籤使用的代碼。 你可以閱讀更多關於here

+0

我需要標籤。 – jul

+0

是的,您可以保留引用該片段的標記,但使用'addToBackStack(null)'工作嗎?如果你使用這個,會發生什麼? –

+0

我沒有試過,因爲它對我沒有意義。所以我實現了我自己的'Fragment'堆棧(請參閱我的答案)。 – jul

0

我實現我自己的Fragment堆棧:

public Fragment addFragmentToStack(Fragment fragment){ 
    if(MyApplication.fragmentStack.size()>20){ 
     MyApplication.fragmentStack.remove(0); 
    } 
    return MyApplication.fragmentStack.push(fragment); 
} 

public void onBackPressed() { 
     if (MyApplication.fragmentStack.size() > 0) { 
      FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
      ft.replace(R.id.content_container, MyApplication.fragmentStack.pop()); 
      ft.commit(); 
     } 
     else{ 
      finish(); 
     } 
} 
24

做到這一點,正確的方法是使用onBackPressed()方法來趕上回事件在你的應用程序,然後「啪」返回堆棧與popBackStack()。例如:

public void onBackPressed() 
{ 
    // Catch back action and pops from backstack 
    // (if you called previously to addToBackStack() in your transaction) 
    if (getSupportFragmentManager().getBackStackEntryCount() > 0){ 
     getSupportFragmentManager().popBackStack(); 
    } 
    // Default action on back pressed 
    else super.onBackPressed(); 
} 

PD:抱歉延遲應答,但我剛剛看到您的問題。希望能幫助到你!

+0

那麼,爲什麼在Android文檔中,他們傳達了錯誤的方式。 :( –

+2

我不認爲這個邏輯是必須的,如果你使用'addToBackStack',應用程序的功能將完全相同 –

+0

與所有doco似乎指向這些構造的用法相反,我也只能得到這個工作按預期瓦特/此代碼在'OnBackPressed'的加入:/ – bc3tech

2

我已經有一段時間了,但我希望這會幫助某人。

fragmentTransaction.addToBackStack(null)將無法​​正常工作,如果你延長AppCompatActivity。它在Activity中效果很好。我找不到原因。