0

我有一個容器的片段和NavigationDrawer的活動。如果我在抽屜中選擇一個項目,我打電話給updatePage(index)片段和後臺有時會搞砸

我也打電話updatePage(0)如果我創建活動和savedInstanceState == null來啓動我的活動。

一個片段有一個子片段,因此它只是通過子片段替換自己,並將子片段添加到後臺堆棧,以便用戶可以導航回到前一個片段。在這個片段我打電話下面的代碼直接:

@Override 
public void onClick(View view) 
{ 
    Event event = (Event)view.getTag(); 

    FragmentManager fm = getActivity().getSupportFragmentManager(); 

    GamesFragment f = new GamesFragment(); 

    Bundle bundle = new Bundle(); 
    bundle.putParcelable(GamesFragment.KEY_EVENT, event); 
    f.setArguments(bundle); 

    FragmentTransaction ft = fm.beginTransaction() 
      .replace(R.id.frame_container, f, f.getClass().getName()) 
      .addToBackStack(null); 
    ft.commit(); 
} 

爲什麼有時老片段不行去除?我覆蓋了碎片,但有時只是。

我的活動updatePage功能看起來像以下:

private void updatePage(int drawerSelection) 
{ 
    mDrawer.closeDrawer(); 

    Fragment f = null; 
    FragmentManager fm = getSupportFragmentManager(); 

    switch (drawerSelection) 
    { 
     case 0: 
      f = fm.findFragmentByTag(HomeFragment.class.getName()); 
      if (f == null) 
       f = new HomeFragment(); 
      break; 
     case 1: 
      f = fm.findFragmentByTag(EventFragment.class.getName()); 
      if (f == null) 
       f = new EventFragment(); 
      break; 
     default: 
      break; 
    } 

    if (f != null && !f.isAdded()) 
    { 
     // SOLUTION: 
     // Backstack clearen 
     // fm.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
     FragmentTransaction ft = fm.beginTransaction(); 
     ft.replace(R.id.frame_container, f, f.getClass().getName()); 
     ft.commit(); 
    } 
} 

回答

1

我看到這樣的情況下幾次,我敢打賭,它可以與addToBackStack更換後發生。最簡單的修復方法是爲片段佈局添加背景。從Android文檔:

注意:當您刪除或替換片段並將事務添加到後退堆棧時,被刪除的片段將停止(未銷燬)。如果用戶返回來恢復片段,則重新啓動。如果您不將事務添加到後退堆棧,那麼在移除或替換時碎片將被銷燬。

此視圖不會完全重繪,只是透支,如果第二個片段沒有背景或視圖容器重繪,您將獲得所述的效果。這是我的理論:>。有時Android文檔不如我們希望的那麼清晰。

+0

其實,我現在明白爲什麼會發生這種情況...將發佈一個簡短的解決方案 – prom85

1

問題是以下用例:

GameFragment要去EventFragment按下「刪除(EventFragment)。新增(GameFragment)」事務到返回堆棧。如果我現在按下後退按鈕,此事務將被撤消並且一切正常。後臺又空了,一切正常。但是,如果我沒有按下後退按鈕,但通過菜單切換到另一個片段,後臺堆棧仍然有上述事務。現在回頭會嘗試撤銷這個事務...它只會在我的菜單點擊處理程序中的代碼添加菜單中的代碼之前讀取EventFragment ...這是如何發生的...

簡單的解決方案,如果我只希望每個菜單條目都有一個後臺堆棧並且想要刪除後臺堆棧,如果我在菜單中選擇了我的應用程序的另一個區域,在通過菜單去另一個區域之前清除後臺堆棧...

因此,添加'fm.popBackStackImmediate(null,FragmentManager.POP_BACK_STACK_INCLUSIVE);'之前更換當前片段將解決問題(我添加此解決方案作爲我的主要職位的評論)