【问题标题】:Saving and restoring state using fragments使用片段保存和恢复状态
【发布时间】:2016-12-03 15:17:53
【问题描述】:

我试图了解使用片段保存和恢复状态的过程。我已经使用它创建了滑动导航菜单。

在其中一个片段中有这段代码:

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
    }

}

例如,我想在用户退出片段之前保存 CheckBox 的状态,并在再次创建片段时恢复它。如何做到这一点?

编辑:

根据 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。我做错了什么?

【问题讨论】:

    标签: android android-fragments savestate


    【解决方案1】:

    您希望将当前选中状态的值保存在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 中创建新片段。但它可能会为您指明正确的方向。

    【讨论】:

    • 它对我不起作用。我添加了 if (savedInstanceState == null) { Log.i("statenull", "null"); } 。每次我打开那个片段时它都会记录这个:/
    • 那么您是否在onSaveInstanceState 中存储了任何内容?用你所拥有的更新你的帖子。
    • 是的,这个outState.putBoolean(CHECK_BOX_STATE, cb.isChecked());
    • 用你所拥有的更新你的帖子。 @Godfryd
    • 我正在使用类似于 this post 的导航抽屉片段。也许它与这个问题有关?这一定是问题,因为我每次点击菜单时都会创建新片段。
    【解决方案2】:

    看完所有的例子。这是保存片段状态的解决方案:

    两个步骤:

    1.

    String saveValue;
     
     
     @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            if (savedInstanceState == null) {
                saveValue = "";
            } else {
    
                saveValue = savedInstanceState.getString("saveInstance");
              
    
            }
        }
    
    @Override
        public void onSaveInstanceState(Bundle savedInstanceState) {
            super.onSaveInstanceState(savedInstanceState);
            //save the values of fragment if destroy on second to back
            if (!saveValue.isEmpty())
                savedInstanceState.putString("saveInstance", saveValue);
           
        }
    

    onSaveInstanceState 中,您可以保存您的值。在销毁片段后,您可以通过 onCreate 接收您的值。

    【讨论】:

      猜你喜欢
      • 2015-10-06
      • 2013-04-04
      • 2014-04-25
      • 2014-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多