2014-10-18 164 views
0

我對此感到頭疼。管理碎片狀態

的場景是以下內容:

我有與承載4個片段A的FrameLayout一個活動。
我不介意重新創建每個片段,除了其中一個
有一個我需要保持不變。

這裏是我的導航方案:

Navigation scheme

我想保留,而不是重建的片段是破片一

在我的活動我有用於管理該片段此方法:

protected final static int FRAG_A=0; 
protected final static int FRAG_B=1; 
protected final static int FRAG_C=2; 
protected final static int FRAG_D=3; 

protected void displayNewFragment(int newFragment) 
{ 
    Fragment fragment=null; 
    String tag=null; 

    switch(newFragment) 
    { 
     case FRAG_A: 
      tag=FragA.TAG; 
      fragment=new FragA(); 

      break; 

     case FRAG_B: 
      tag=FragB.TAG; 
      fragment=new FragB(); 

      break; 

     case FRAG_C: 
      tag=FragC.TAG; 
      fragment=new FragC(); 

      break; 

     case FRAG_D: 
      tag=FragD.TAG; 
      fragment=new FragD(); 

      break; 
    } 

    if(fragment!=null) 
     manager.beginTransaction().replace(R.id.main_container, fragment, tag).commit(); 
    else 
     Log.e(getClass().getSimpleName(), "Error creating content (null)."); 
} 

此方法由片段時,我想切換到另一種叫,作爲parent的參考活性(主):

parent.displayNewFragment(Main.FRAG_A) // Or FRAG_B, C, D, etc 

我知道,我重新創建每個實例在方法和以前被破壞(如我所說的片段交易replace這個工程除了要問什麼,我完美:
如何防止破壞FragA並保持其狀態?

預先感謝您。

回答

1

請使用addToBackStack到prvent破壞片段,並保持其狀態如下表: -

if(fragment!=null) 
    manager.beginTransaction().replace(R.id.main_container, fragment, tag).addToBackStack("spartacus").commit(); 
else 
    Log.e(getClass().getSimpleName(), "Error creating content (null)."); 

乾杯... !!! 請讓我知道如果你的工作或不:)

+0

首先,謝謝你的回答。但這不是解決方案。除非絕對必要,否則我不想將該片段添加到BackStack。我最終在Activity中設置了一個引用FragA的全局變量,而不是在'displayNewFragment'方法中重新實例化它。然後在片段中,我重新使用'onCreateView'中的根視圖,而不是每次重新創建。我幾乎可以肯定,這不是最好的解決方案,但現在它的工作。我會繼續嘗試其他方法。乾杯。 – Alberto 2014-10-20 11:08:52

0

要在活動管理的片段,你需要使用 FragmentManager。要獲取它,請從 活動中調用getFragmentManager()。

一些東西,你可以用FragmentManager操作包括:

  • 獲取中存在的活性的片段,與findFragmentById()(用於提供在活動佈局的UI片段)或 findFragmentByTag ()(對於提供或不提供UI的片段)。

  • 使用popBackStack()(模擬用戶的Back命令)將背離堆棧的碎片彈出。

  • 使用addOnBackStackChangedListener()註冊偵聽器以更改返回堆棧。