2013-05-27 5 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-on-onrestoreinstancestate) –

答えて

15
  • onSaveInstanceState()活動を一時停止する前に、データを格納するために使用される方法です。

説明:フックビューが後で同じ状態に新しいインスタンスを作成するために使用することができ、その内部状態の表現を生成することを可能にします。この状態には、永続的ではない情報または後で再構成できない情報のみが含まれている必要があります。たとえば、現在の位置を画面に保存することはありません。これは、ビューの新しいインスタンスがそのビュー階層に配置されたときに再度計算されるためです。

  • onRestoreInstanceState()は、そのデータを取得するためのメソッドです。

説明: savedInstanceStateここに与えられた活性は、以前に保存した状態から再初期化されているとき()ONSTART後に呼ばれるこの方法は、。ほとんどの実装では、onCreate(Bundle)を使用して状態を復元しますが、すべての初期化が完了した後で行うのが便利な場合や、サブクラスが既定の実装を使用するかどうかを決定できる場合があります。このメソッドのデフォルトの実装では、以前にonSaveInstanceState(Bundle)で凍結されたビューステートの復元が実行されます。

ここで、この例を考えてみましょう:
あなたのアプリは、ユーザーがいくつかの情報を入れた3つのエディットボックスを持っていますが、あなたは彼が入力されたすべてが失われますどのような上記の方法を使用していなかったので、もし彼がコールを取得します。
したがって、現在のデータは、(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

編集ボックスにテキストを保存する必要がありますか? docは次のように述べています。「デフォルトの実装では、IDを持つ階層の各ビューでonSaveInstanceState()を呼び出すことで、インスタンスごとのUIの大半が処理されます。」 –

35

それは以前に破壊された後、あなたの活動が再作成されたとき、あなた システムが あなたを渡すことをバンドルから保存された状態を回復することができますアクティビティ。 onCreate()およびonRestoreInstanceState() コールバックメソッドは、インスタンス の状態情報を含む同じBundleを受け取ります。

のonCreate()メソッドは、システムが あなたの活動の新しいインスタンスを作成したり、前のものを再現しているかどうかと呼ばれているので、あなたは あなたがそれを読み取ろうとする前の状態のバンドルがnullであるかどうかを確認する必要があります。 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の答えでリンクされているドキュメントによれば、スーパーコールは、スーパーラストを呼び出すことによって保存されたインスタンスバンドルを通過します。スーパー・ファーストを呼び出した場合は、アクティビティー・インスタンスにデータを渡さずに、プロシージャー呼び出しの終わりにインスタンス状態をバンドルのコピーとして残します。 Javaは参考値ではなく、価値のあるものです。 :)私が.NETから来ていることを学んだことは非常に難しいレッスンです。 – DoctorD

+0

@DoctorD、おっと!あなたは正しいです。私はカフェインの欠乏にそれを責める。 – DataDino

9

あなたはonCreate()方法でsavedValueを使用するためです。 savedValueonRestoreInstanceState()メソッドで更新されますが、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(); 
    } 
} 
関連する問題