如何对片段使用onSaveInstanceState()

时间:2014-09-10 02:53:33

标签: android android-activity android-fragments android-fragmentactivity android-lifecycle

当我的Fragment被销毁时,我需要保存一些成员变量。但是,研究表明,片段变量不会像活动那样保存onSaveInstanceState。因此,我无法保存这些变量。

我的片段是PageViewer的一部分,因此我无法弄清楚如何store the Fragments in the Bundle of the Activity's onSaveInstanceState(我没有明确定义片段,因为他们'在PageViewer Adapter中重新创建!)

我已经看到它建议我使用Fragment Arguments来存储这些变量,但是当我在Arguments包上调用containsKey时,我总是得到false

有什么建议在他们调用onStop时保存Fragments的成员变量?

这是我的片段onCreateView

public FinalCalcFragment(){
        setArguments(new Bundle());
    }    
@Override
    public View onCreateView(LayoutInflater inflater,
            ViewGroup container, Bundle savedInstanceState) {
        rootView = inflater.inflate(
                R.layout.activity_grade_calculator, container, false);
        Bundle args = getArguments();
        if(args.containsKey("visYes")){
            firstLoad = args.getBoolean(PERSISTENT_FIRSTLOAD_BUNDLE_KEY);
            System.out.println("contains the key");
        }
        context = this.getActivity();

        if(firstLoad) {   //This is so that I don't reset my views when recreating.
            bindAll();
            setInitialViews();  
            setListeners();
        }
        firstLoad = false;
        return rootView;
    }

以下是我的onPauseonSaveInstanceState。我试着在两者中存储我的论点,但都没有奏效。

@Override
public void onPause(){
    super.onPause();
    getArguments().putBoolean(PERSISTENT_FIRSTLOAD_BUNDLE_KEY, firstLoad);
    getArguments().putBoolean("visYes", ((TextView) rootView.findViewById(R.id.tv_grade_calc_result)).isShown());
}

@Override
public void onSaveInstanceState(Bundle outState){
    super.onSaveInstanceState(outState);
    getArguments().putBoolean(PERSISTENT_FIRSTLOAD_BUNDLE_KEY, firstLoad);
    getArguments().putBoolean("visYes", ((TextView) rootView.findViewById(R.id.tv_grade_calc_result)).isShown());
}

这是我的适配器getItem方法的摘录。

@Override
public Fragment getItem(int i) {
    //System.out.println("We are trying to get item " + i);
    switch(i) {
        case 0:
            Fragment fragment = new FinalCalcFragment();
            return fragment;

1 个答案:

答案 0 :(得分:0)

您应该使用Bundle outState来保存片段实例状态,就像活动一样。更改getArguments()返回的参数无效。 然后在onCreateView中首先检查传递的savedInstanceState。如果savedInstanceState不为null,则使用它,如果为null,则使用getArguments()返回的Bundle。