Android savedInstanceState 总是返回 null

Posted

技术标签:

【中文标题】Android savedInstanceState 总是返回 null【英文标题】:Android savedInstanceState return always 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();

【问题讨论】:

SavedInstanceState is always null in fragment 的可能重复项 【参考方案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

【讨论】:

以上是关于Android savedInstanceState 总是返回 null的主要内容,如果未能解决你的问题,请参考以下文章

活动按钮不听

android中如何实现输入内容后,按回车键发送

TabLayout 和 ViewPager综合示例

下拉加载:

在复选框中显示联系人和电话号码

当我尝试从 savedInstanceState 获取额外内容时,应用程序崩溃了