2013-05-27 24 views
33

我正在嘗試跨方向更改保存數據。如下面的代碼所示,我使用onSaveInstanceState()onRestoreInstanceState()。我嘗試獲取保存的值,並檢查onRestoreInstanceState()中的值是否正確。但是當我嘗試使用onCreate()中的新值時,我沒有新的價值,只有舊的價值。如何使用onSaveInstanceState()和onRestoreInstanceState()?

protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putString("TEXT", user); 

    } 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    savedUser = savedInstanceState.getString("TEXT"); 
    Log.d("enregistred value", savedUser); 

} 



public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     int display_mode = getResources().getConfiguration().orientation; 

     if (display_mode == 1) { 

      setContentView(R.layout.main_grid); 
      mGrid = (GridView) findViewById(R.id.gridview); 
      mGrid.setColumnWidth(95); 
      mGrid.setVisibility(0x00000000); 
      // mGrid.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); 

     } else { 
      setContentView(R.layout.main_grid_land); 
      mGrid = (GridView) findViewById(R.id.gridview); 
      mGrid.setColumnWidth(95); 
      Log.d("Mode", "land"); 
      // mGrid.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); 

     } 
     Log.d("savedUser", savedUser); 
     if (savedUser.equals("admin")) { //value 0 
      adapter.setApps(appManager.getApplications()); 
     } else if (savedUser.equals("prof")) { //value 1 
      adapter.setApps(appManager.getTeacherApplications()); 
     } else {// default value 
      appManager = new ApplicationManager(this, getPackageManager()); 
      appManager.loadApplications(true); 
      bindApplications(); 
     } 
} 
+1

可能重複[的onSaveInstanceState()和onRestoreInstanceState()](http://stackoverflow.com/問題/ 4096169/onsaveinstancestate-and-onrestoreinstancestate) –

回答

15
  • onSaveInstanceState()是用於暫停活動之前,將數據存儲的方法。

描述:鉤允許以產生它的內部狀態的表示可在以後被用來與相同的狀態創建新的實例。此狀態應僅包含不持久或以後不能重建的信息。例如,您永遠不會將當前位置存儲在屏幕上,因爲當視圖的新實例放置在其視圖層次結構中時會再次計算該位置。

  • onRestoreInstanceState()是用於檢索該數據的方法。

描述:此方法,當活動被從先前保存的狀態重新初始化()在onStart後被調用時,在savedInstanceState這裏給出。大多數實現將簡單地使用onCreate(Bundle)來恢復其狀態,但在完成所有初始化或允許子類決定是否使用默認實現之後,在此處執行操作有時很方便。此方法的默認實現會執行之前由onSaveInstanceState(Bundle)凍結的任何視圖狀態的還原。

這裏看看這個例子:
您的應用程序有3個編輯框,其中用戶在一些信息推杆,但他收到電話,所以如果你沒有使用上面的方法是什麼,他進入都將丟失。
因此,總是將當前數據保存在onPause()的Activity方法中,作爲包&的onResume()方法調用onRestoreInstanceState()方法。

請參閱:

How to use onSavedInstanceState example please

http://www.how-to-develop-android-apps.com/tag/onrestoreinstancestate/

+0

請你給我舉個例子。因爲我知道當我改變方向時,我打電話onDestroy然後Oncreat,所以我怎麼能在Oncreat中使用保存的價值。 – Zizou

+0

請參閱上述鏈接 –

+1

您確定需要將文本保存在編輯框中嗎?該文檔說:「默認實現通過在具有ID的層次結構中的每個視圖上調用onSaveInstanceState()來爲您處理大部分UI每個實例狀態......」 –

35

當後,先前被摧毀了你的活動被重建,你 可以從包中恢復已保存的狀態,該系統通過 您活動。 onCreate()和onRestoreInstanceState()回調方法都會收到包含實例 狀態信息的相同Bundle。

因爲無論系統是否創建 活動的新實例或重新創建以前的活動,都會調用onCreate()方法,您必須在嘗試讀取它之前檢查狀態Bundle是否爲null。 如果它爲空,那麼系統正在創建一個 活動的新實例,而不是恢復先前銷燬的實例。

static final String STATE_USER = "user"; 
private String mUser; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // Check whether we're recreating a previously destroyed instance 
    if (savedInstanceState != null) { 
     // Restore value of members from saved state 
     mUser = savedInstanceState.getString(STATE_USER); 
    } else { 
     // Probably initialize members with default values for a new instance 
     mUser = "NewUser"; 
    } 
} 

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    savedInstanceState.putString(STATE_USER, mUser); 
    // Always call the superclass so it can save the view hierarchy state 
    super.onSaveInstanceState(savedInstanceState); 
} 

http://developer.android.com/training/basics/activity-lifecycle/recreating.html

+2

我試過這個,但我的應用程序崩潰。 – Zizou

+0

@DataDino在Arvis的答案中鏈接的文檔顯示,超級調用通過調用超級最後傳遞已保存的實例包。如果您先調用super,則在過程調用結束時將實例狀態保留爲該包的副本,而不會將數據傳遞給活動實例。 Java是有價值的,而不是參考。 :)我從.NET學到的非常辛苦的教訓。 – DoctorD

+0

@DoctorD,哎呀!你是對的。我把它歸咎於缺乏咖啡因。 – DataDino

9

這是因爲你在onCreate()方法使用savedValuesavedValueonRestoreInstanceState()方法中更新,但在onCreate()方法後調用onRestoreInstanceState()。您可以:

  1. 更新savedValueonCreate()方法,或
  2. 將在onRestoreInstanceState()方法使用新savedValue的代碼。

但我建議你使用第一種方法,使得這樣的代碼:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    int display_mode = getResources().getConfiguration().orientation; 

    if (display_mode == 1) { 

     setContentView(R.layout.main_grid); 
     mGrid = (GridView) findViewById(R.id.gridview); 
     mGrid.setColumnWidth(95); 
     mGrid.setVisibility(0x00000000); 
     // mGrid.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); 

    } else { 
     setContentView(R.layout.main_grid_land); 
     mGrid = (GridView) findViewById(R.id.gridview); 
     mGrid.setColumnWidth(95); 
     Log.d("Mode", "land"); 
     // mGrid.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); 

    } 
    if (savedInstanceState != null) { 
     savedUser = savedInstanceState.getString("TEXT"); 
    } else { 
     savedUser = "" 
    } 
    Log.d("savedUser", savedUser); 
    if (savedUser.equals("admin")) { //value 0 
     adapter.setApps(appManager.getApplications()); 
    } else if (savedUser.equals("prof")) { //value 1 
     adapter.setApps(appManager.getTeacherApplications()); 
    } else {// default value 
     appManager = new ApplicationManager(this, getPackageManager()); 
     appManager.loadApplications(true); 
     bindApplications(); 
    } 
} 
相關問題