2013-01-16 112 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; 
}