2014-11-04 62 views
1

我有FragmentA和FragmentB,我在一個FragmentB當我回到FragmentA我需要加載最後的價值,但我savedInstanceState回報總是空:的Android savedInstanceState返回總是空

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(); 
+0

可能重複[SavedInstanceState在片段中始終爲空](http://stackoverflow.com/questions/20550016/savedinstancestate-is-always-null-in-fragment) – jlopez 2014-11-04 16:53:18

回答

1

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

       } 
      } 
0

確保包含片段的活動不會覆蓋onSaveInstanceState(或至少調用超級方法)。

0

使用sharedPreferences將數據從片段B傳遞給片段A.

0

錯誤,如果你按下不處理onBackPressed(),那麼你的應用程序關閉時不保存任何實例,但如果你按回家,保存將會發生。記得在backPressed上處理,刪除它的超級