2015-02-10 44 views
-1

在我的基本活動類中,我有鏈接到我從菜單調用的所有片段。如何正確使用片段

事情是這樣的:

BaseFragment mProjects; 
BaseFragment mProfile; 

public BaseFragment getFragment(FragmentType type) { 
     BaseFragment fr = null; 
     switch (type) { 
      case PROFILE: 
       fr = new Profile(); 
       break; 
      case PROJECTS: 
       fr = new Projects(); 
       break; 
      default: 
       return null; 
     } 

     return fr; 
    } 

所以,我創建片段從菜單一個時間訪問的實例。好嗎?或者我應該每次創建片段?如果是這樣,那麼我怎樣才能保存片段狀態(數據,位置)?因爲當我從片段管理器使用replace時,替換片段的onSaveInstanceState未被調用。所以當我重新打開它時,沒有保存狀態。

順便說一句,我在活動使用onSaveInstanceState

@Override 
public void onSaveInstanceState(Bundle saveInstanceState) { 

    // doing things 
    super.onSaveInstanceState(saveInstanceState); 
} 

無論如何,如果我不存儲指向片段片段onSaveInstanceState將永遠不會被調用。所以,我可以在方法中存儲片段的狀態,但它似乎不好解決方案。

UPD:這不是基於意見的問題。應該有使用片段的最佳做法。所以我問這個。

回答

0

也許你在你的FragmentActivity中犯了一個錯誤。

也許你在FragmentActivity的onSaveInstanceState覆蓋無通話super.onSaveInstanceState(捆綁outState)

這將導致該方法的onSaveInstanceState ** **在片段不叫

UPDATE 另外,您可以使用隱藏/顯示,而不是替換,當你想顯示新的片段...隱藏的片段不會被殺死

+0

@Override \t公共無效的onSaveInstanceState(捆綁outState){ \t \t super.onSaveInstanceState(outState); //數據保存 } – Suvitruf 2015-02-10 11:14:54

+0

我談論的FragmentActivity,不片段本身 – 2015-02-10 11:17:28

+0

在活動: @覆蓋 \t公共無效的onSaveInstanceState(捆綁saveInstanceState){ \t // smthng保存 \t super.onSaveInstanceState( saveInstanceState); \t} – Suvitruf 2015-02-10 11:18:56

0

在你替換當前顯示的片段之前,你需要getSupportFragmentManager().putFragment(Bundle, String, Fragment),這個會將該片段存儲到您可以保留引用的Bundle中,並保存到您的活動的實例狀態。

在您的getFragment方法中,首先檢查您保存片段的包是否包含您要創建的片段 - getSupportFragmentManager().getFragment(Bundle, String)。這會給你一個你可以返回和替換的片段。如果不是,請按照當前情況創建片段的新實例。

+0

但爲什麼引用Bundle更好,然後直接引用片段?或者爲什麼它更好,然後片段的HashMap? – Suvitruf 2015-02-10 11:58:35

+0

FragmentManager包含活動片段的數組,並處理它們的狀態。 put和get方法只是存儲一個額外的int(片段的id)。保留自己對片段的引用可能很容易失去同步,並且如果您嘗試再次保存它們,可能會使已保存實例狀態的量增加一倍。 – FunkTheMonk 2015-02-10 13:25:35

+0

我試過了。但對於我使用putFragment添加的所有鍵,它會生成相同的int值。這就是爲什麼它在getFragment中返回錯誤的值... – Suvitruf 2015-02-10 14:09:09