2013-01-16 113 views
35

我試圖加載一個新的片段,當一個方法被調用。這種方法創建一個新的片段,並「替換」其他片段:Android:片段backStack

private void showTestFragment(Fragment oldFragment, boolean addBackStack, BaseAdapter adapter, int position) { 
    Cursor cursor = (Cursor)adapter.getItem(position); 
    if(cursor != null){ 

     int idx = cursor.getColumnIndexOrThrow(Episode._ID); 
     long rowId = cursor.getLong(idx); 

     FragmentManager fragmentManager = getFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

     if(oldFragment != null){ 
      Log.i(TAG, "Removing the old fragment"); 
      fragmentTransaction.remove(oldFragment); 
     } 

     TestFragment testFragment = new TestFragment(); 
     testFragment.setId(rowId); 

     fragmentTransaction.add(android.R.id.content, testFragment); 

     if(addBackStack){ 
      Log.i(TAG, "Added to the backstack"); 
      fragmentTransaction.addToBackStack(TAG); 
     } 

     fragmentTransaction.commit(); 
     Fragment f = getFragmentManager() 
       .findFragmentById(R.id.index); 
     Log.i(TAG, "after commit, frag is "+ f); 
    } 
} 

這工作正常,直到我回去。當我回去時應該刪除最後一個片段。之前我要去實現對活動

public void onBackPressed(){} 

方法來刪除最後一個片段,我想知道如果我正確處理片段變化。它看起來像我在這裏失去了一些東西..

+0

的可能的複製[如何實現片段onBackPressed()?](http://stackoverflow.com/questions/5448653/how-to-implement-onbackpressed-in-fragments) –

回答

78

如果你真的想更換片斷,然後使用替代()梅索德,而不是進行刪除()和一個add()。

FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    fragmentTransaction.replace(..............); 
    fragmentTransaction.addToBackStack(null); 
    fragmentTransaction.commit(); 

不要忘記做addToBackStack(空),所以之前的狀態將被添加到返回堆棧讓你回去與後退按鈕。請參閱https://developer.android.com/reference/android/app/FragmentTransaction.html#replace(int, android.app.Fragment, java.lang.String)

另一個好的來源是http://developer.android.com/guide/components/fragments.html(搜索replace()函數)。

+2

替換()= = remove(thisFragment).add(anotherFragment).. Replace等於這兩個方法的順序。 – Nepster

+0

@Nepster,是的,但並不總是方便。 FWIW,區別在於Replace會移除容器中的任何片段;不需要知道'thisFragment'。一個情況是,如果片段A鏈接到片段B1,片段B1被片段B2取代。那麼,如果想要「返回」按鈕返回到片段A(而不是B1),我們必須手動編碼,因爲Android的後面會[不正確的恕我直言]做「刪除B1,添加A」 - 與原始鏈接相反從A到B1。 B2潛伏在後面。我們的代碼必須知道B2是當前片段,而不是B1。有時候這很不方便。 – ToolmakerSteve

4

只需卸下第一和呼叫super.onBackPressed

public void onBackPressed(){ 

    // here remove code for your last fragment 
    super.onBackPressed(); 

} 
0
//lets wait for systems back to finish 

super.onBackPressed(); 

//here we believe a fragment was popped, so we need to remove the fragment from ourbackstack 
if(fragmentBackStack.size()>0) 
{ 
    Log.d("custombackstack","before back: "+fragmentBackStack.size()+" current:"+fragmentBackStack.peek()); 

    fragmentBackStack.pop();    
} 
//after popping is the size > 0, if so we set current fragment from the top of stack, otherwise we default to home fragment. 
if(fragmentBackStack.size()>0) 
{   
    Log.d("custombackstack","after back: "+fragmentBackStack.peek()); 
currentFragment = fragmentBackStack.peek();   
} 
else 
{   
    //back stack empty 
    currentFragment = HOME_FRAGMENT; 
}