2015-11-19 36 views
1

我已經得到了我的初始化,並承諾像這樣兩個片段....Android的碎片popFromBackstack()只能使用一次

FragmentA

getFragmentManager().beginTransaction() 
      .add(R.id.filter_fragment, fragmentA) 
      .commit(); 

FragmentB

getFragmentManager().beginTransaction() 
      .replace(R.id.filter_fragment, fragmentB) 
      .addToBackStack(null) 
      .commit(); 

FragmentA在應用程序啓動時創建並顯示,但直到用戶單擊按鈕時才顯示FragmentB。

  1. 片段A加載的應用程序,我有是這樣的問題......開始
  2. 用戶操作創建片段B;片段B顯示成功。
  3. 用戶按下設備後退按鈕,調用getFragmentManager.popBackStack()。片段A成功顯示。
  4. 用戶操作再次創建碎片B;片段B顯示成功。
  5. 用戶按設備後退按鈕,調用getFragmentManager.popBackStack()應用程序崩潰並出現以下錯誤:

    java.lang.IllegalStateException: Fragment already added: FragmentB{3c73b216 #2 id=0x7f0f00c6} 
    

我一直在拉我的頭髮最後一天試圖找出爲什麼交易和彈出堆棧中一個工作時間,但崩潰第二次。我嘗試過使用各種組合add(),replace(),remove()等,並且它只會變得更糟。我目前崩潰的執行情況是最近的。

+0

發佈更多代碼以更好地解釋您的問題.. – Akhil

回答

2

設置第一個片段:

if (null == savedInstanceState) { 
    getSupportFragmentManager().beginTransaction().addToBackStack("fragmentA").replace(R.id.container, new FragmentA(), "CURRENT_FRAGMENT_TAG").commit(); 
} 

OnCreate您的活動


使用此功能,以取代片段,以避免一遍又一遍地將相同的片段再次堆棧:

​​

執行示例:

replaceFragment(new FragmentB(), "fragmentB"); 


覆蓋onBackPressed

@Override 
public void onBackPressed() { 
    if (getSupportFragmentManager().getBackStackEntryCount() == 1) { 
     finish(); 
    } else { 
     super.onBackPressed(); 
    } 
} 
1

您的活動調用FragmentA, 做到這一點:

getFragmentManager().beginTransaction() 
     .replace(R.id.filter_fragment, fragmentA) 
     .commit(); 

和R.id.filter_fragment,應該從這裏將舉辦碎片佈局的活動佈局。