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的主要内容,如果未能解决你的问题,请参考以下文章