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