2016-12-03 34 views
0

我想了解使用片段保存和恢復狀態的過程。我使用它創建了滑動導航菜單。使用片段保存和恢復狀態

在一個片段有這樣的代碼:

public class FifthFragment extends Fragment { 

    CheckBox cb; 
    View view; 

    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 

     view = inflater.inflate(R.layout.fifth_layout, container, false); 
     cb = (CheckBox) view.findViewById(R.id.checkBox); 
     return view; 

    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     if (savedInstanceState != null) { 
      // Restore save state 
     } 

    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     // save state 
    } 

} 

例如,我想用戶退出片段之前保存複選框的狀態,並重新創建片段時恢復。如何實現這一目標?

編輯:

根據raxellson的答案,我已經改變了我的片段是:

public class FifthFragment extends Fragment { 

    private static final String CHECK_BOX_STATE = "string"; 
    CheckBox cb; 
    View view; 

    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fifth_layout, container, false); 

     cb = (CheckBox) view.findViewById(R.id.checkBox); 
     if (savedInstanceState == null) { 
      Log.i("statenull", "null"); 
     } 
     if (savedInstanceState != null) { 
      // Restore last state for checked position. 
      boolean checked = savedInstanceState.getBoolean(CHECK_BOX_STATE, false); 
      cb.setChecked(checked); 
     } 

     return view; 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putBoolean(CHECK_BOX_STATE, cb.isChecked()); 
    } 

} 

我得到了登錄I/statenull: null所以savedInstanceState未保存。我究竟做錯了什麼?

回答

3

您想要將當前選中狀態的值保存在onSaveInstanceState中。

事情是這樣的:

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putBoolean(CHECK_BOX_STATE, cb.getChecked()); 
} 

,然後當你的視圖中創建你想要得到的值,如果它的存在。並設置你的CheckBox狀態。

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fifth_layout, container, false); 

    cb = (CheckBox) view.findViewById(R.id.checkBox); 
    if (savedInstanceState != null) { 
     // Restore last state for checked position. 
     boolean checked = savedInstanceState.getBoolean(CHECK_BOX_STATE, false); 
     cb.setChecked(checked);    
    } 

    return view; 
} 

編輯:

當您添加的片段,一定要與標籤或ID添加它,以便您可以檢索相同的實例。

你可以做一個輔助方法來檢索片段並設置片段。

private void setFragment(String tag, Fragment newFragment) { 
    FragmentManager fm = getSupportFragmentManager(); 
    Fragment savedFragment = fm.getFragmentByTag(tag); 
    fm.replace(R.id.container, savedFragment != null ? savedFragment : newFragment, tag); 
    fm.commit(); 
} 

所以你你switch你可以調用輔助方法。

switch (position) { 
    case 0: 
    setFragment("A", new FragmentA()); 
    break; 
    .... 
} 

注意:這只是一個例子最好的做法,因爲你在你的switch case創造每一次新的片段,現在反正。但它可能會指向你正確的方向。

+0

它不適合我。我已經添加了'if(savedInstanceState == null){ Log.i(「statenull」,「null」); }'。每當我打開這個片段時,它就會記錄下這個:/ – Godfryd

+0

那麼你是否在'onSaveInstanceState'中存儲了任何東西?用你的東西更新你的文章。 – raxelsson

+0

是的,這個'outState.putBoolean(CHECK_BOX_STATE,cb.isChecked());'。 – Godfryd