[英]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.