【问题标题】:Android savedInstanceState return always nullAndroid savedInstanceState 总是返回 null
【发布时间】:2014-12-31 15:50:55
【问题描述】:

我有 FragmentA 和 FragmentB,当我返回 FragmentA 时,我在 FragmentB 中,我需要加载最后一个值,但我的 savedInstanceState 总是返回 null:

public static class PlaceholderFragment extends Fragment {

        private boolean active=false;



        @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            outState.putBoolean("active",active);

        }

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



        }

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

            if(savedInstanceState!=null)
            {

                active=savedInstanceState.getBoolean("active");
                if(attivo==true)
                {
                    Toast.makeText(getActivity(),"True",Toast.LENGTH_SHORT).show();
                }
                else
                {
                   Toast.makeText(getActivity(),"False",Toast.LENGTH_SHORT).show();

                }
            }

        }

传入 FragmentB 我使用:

getFragmentManager().beginTransaction().replace(R.id.container,new PrefFragment()).addToBackStack("back").commit();

【问题讨论】:

标签: java android android-fragments android-studio


【解决方案1】:

在这种特殊情况下,Bundle savedInstanceState 将始终返回 null,因为它仅在您的 Fragment 被 android 系统销毁并重新创建时才传入(例如,当屏幕旋转或您的应用因系统资源不足而被销毁时) )。 savedInstanceState 不用于在应用程序中持久存储数据,如果你想这样做,我建议使用 SharedPreferences:

private void saveBooleanToPreferences(String key, boolean bool){
     SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
     SharedPreferences.Editor editor = preferences.edit();
     editor.putBoolean(key, bool);
     editor.apply();
}

private boolean getBooleanFromPreferences(String key){
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    boolean bool = preferences.getBoolean(key, false);
    return bool;
}

因此,您的代码将类似于:

 public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBoolean("active",active);
        saveBooleanToPreferences("active",active);
    }

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

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

            if(savedInstanceState!=null)
            {

                active=getBooleanFromPreferences("active")
                if(attivo==true)
                {
                    Toast.makeText(getActivity(),"True",Toast.LENGTH_SHORT).show();
                }
                else
                {
                   Toast.makeText(getActivity(),"False",Toast.LENGTH_SHORT).show();

                }
            }

【讨论】:

    【解决方案2】:

    确保包含 Fragments 的 Activity 不会覆盖 onSaveInstanceState(或至少调用 super 方法)。

    【讨论】:

      【解决方案3】:

      使用 sharedPreferences 将数据从片段 B 传递到片段 A。

      【讨论】:

        【解决方案4】:

        错了,如果你在没有处理 onBackPressed() 的情况下按下返回,那么你的应用程序将关闭而不保存任何实例,但如果你按下 home 则会发生保存。记得在处理 backPressed 时,删除它的 super

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-01-16
          • 2012-12-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-15
          相关资源
          最近更新 更多