繁体   English   中英

Android saveInstanceState返回始终为null

[英]Android savedInstanceState return always null

我有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();

在这种特殊情况下,Bundle savedInstanceState将始终返回null,因为只有在您的片段被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();

                }
            }

确保包含“片段”的活动未覆盖onSaveInstanceState(或至少调用super方法)。

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

错误的是,如果不进行onBackPressed()处理就回退,则您的应用程序将关闭而不保存任何实例,但是如果按home,则将进行保存。 记得在处理backPressed时将其移除

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM