130

私はAndroidのBundle savedInstanceState初心者onCreate(Bundle savedInstanceState)です。developer.android.com から理解しようとしています。しかし、私は理解することができません。誰でも簡単にできますか?

4

6 に答える 6

110

アプリケーションの状態をバンドル (通常は の非永続的な動的データonSaveInstanceState) に保存すると、アクティビティを再作成する必要がある場合 (向きの変更など) に戻すことができるonCreateため、以前の状態を失わないようにすることができます。情報。データが提供されなかった場合savedInstanceStateは null です。

... onPause() メソッドを使用して、永続データ (ユーザー編集など) をストレージに書き込む必要があります。さらに、メソッド onSaveInstanceState(Bundle) は、アクティビティをそのようなバックグラウンド状態にする前に呼び出されます。これにより、アクティビティ内の動的なインスタンスの状態を特定のバンドルに保存し、アクティビティが後で onCreate(Bundle) で受け取ることができます。再作成する必要があります。プロセスのライフサイクルがホストしているアクティビティにどのように結び付けられているかについての詳細は、「プロセスのライフサイクル」セクションを参照してください。onPause() ではなく onSaveInstanceState(Bundle) で永続データを保存することが重要であることに注意してください。後者はライフサイクル コールバックの一部ではないため、ドキュメントに記載されているように、すべての状況で呼び出されるわけではありません。

ソース

于 2012-05-30T05:27:34.987 に答える
18

onCreate(Bundle savedInstanceState)Bundleアクティビティが初めて開始されたときにnullを取得し、アクティビティの向きが変更されたときに使用されます.......

http://www.gitshah.com/2011/03/how-to-handle-screen-orientation_28.html

Android は、これを実現する別のエレガントな方法を提供します。これを実現するには、 というメソッドをオーバーライドする必要がありますonSaveInstanceState()。Android プラットフォームでは、ユーザーは任意のインスタンスの状態を保存できます。インスタンスの状態はバンドルに保存できます。バンドルは引数として onSaveInstanceState メソッドに渡されます。

メソッドに引数として渡されたバンドルから、保存されたインスタンスの状態をロードできますonCreate。保存されたインスタンスの状態をonRestoreInstanceStateメソッドにロードすることもできます。しかし、それは読者の理解に委ねます。

于 2012-05-30T05:25:49.177 に答える
16

Dhruv Gairola が答えたように、Bundle savedInstanceState を使用してアプリケーションの状態を保存できます。私のような新しい学習者が簡単に理解できるように、非常に簡単な例を挙げようとしています。

TextView と Button を持つ単純なフラグメントがあるとします。ボタンをクリックするたびにテキストが変わります。ここで、デバイス/エミュレーターの向きを変更すると、データが失われ (クリックした後に変更されたデータを意味します)、フラグメントが最初から再び開始されることに注意してください。Bundle savedInstanceState を使用することで、これを取り除くことができます。フラグメントのライフサイクルを調べると。フラグメントのライフサイクル フラグメントが破棄されようとしているときに、メソッド「onSaveInstanceState」が呼び出されることがわかります。

したがって、状態は、変更されたテキスト値を次のようにそのバンドルに保存できます

 int counter  = 0;
 @Override
 public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("value",counter);
 }

オリエンテーションを行った後、「onCreate」メソッドが呼び出されますよね? だから私たちはこれを行うことができます

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

    if(savedInstanceState == null){
        //it is the first time the fragment is being called
        counter = 0;
    }else{
        //not the first time so we will check SavedInstanceState bundle
        counter = savedInstanceState.getInt("value",0); //here zero is the default value
    }
}

これで、オリエンテーション後に価値を失うことはありません。変更された値は常に表示されます。

于 2016-07-30T04:29:36.917 に答える
8

Android の onCreate(Bundle savedInstanceState) 関数:

  1. アクティビティが最初に呼び出されるか起動されると、 onCreate(Bundle savedInstanceState) メソッドがアクティビティを作成します。

  2. アクティビティの向き (つまり、水平から垂直、または垂直から水平) が変更された場合、またはアクティビティがオペレーティング システムによって強制的に終了された場合、savedInstanceState (バンドル クラスのオブジェクト) はアクティビティの状態を保存します。

  3. Orientation が変更された後、onCreate(Bundle savedInstanceState) はアクティビティを呼び出して再作成し、savedInstanceState からすべてのデータをロードします。

  4. 基本的に Bundle クラスは、アプリで上記の条件が発生するたびにアクティビティのデータを保存するために使用されます。

  5. アプリには onCreate() は必要ありません。ただし、アプリで使用される理由は、そのメソッドが初期化コードを配置するのに最適な場所だからです。

  6. 初期化コードを onStart() または onResume() に入れることもできます。アプリが最初にロードされると、onCreate() と同じように機能します。

于 2018-01-21T08:21:43.917 に答える
4

onCreate(Bundle)アクティビティが最初に開始されるときに呼び出されます。これを使用して、ユーザー インターフェイスの作成など、1 回限りの初期化を実行できます。onCreate()は、null または によって以前に保存された状態情報のいずれかである 1 つのパラメータを取りますonSaveInstanceState

于 2013-12-01T14:54:40.810 に答える
0

onCreate(Bundle savedInstanceState) が呼び出され、Activity が上記のシナリオ (ビジュアル ビュー) で終了した場合、savedInstanceState は null 以外になります。アプリは、savedInstanceState からデータを取得 (キャッチ) し、アクティビティを再生成できます。

于 2014-03-05T08:32:49.573 に答える