4

このトピックについては、すでにSOで質問されていることがたくさんあることに気づきました。しかし、アクティビティの状態を保存することになると、基本的なことすらわかりません。


(下のスクリーンショットを参照)アプリが起動すると、

1)ScrollViewアイテム1、2、3、4が表示されます

2)Gainerボタンによって入力されたデータがテーブルに含まれています。


以下のスクリーンショットに示されているように、アプリがPORTRAITモードで実行されている間、私は

1)ScrollViewアイテム4、5、6までスクロールダウン

2)敗者ボタンを押したので、それに応じてボタンの下の表のデータが変わります。

3)グラフの内容も動的に変更します(まだ変更していません)。


今、私はランドスケープモードに切り替えますので

1)ScrollViewはScrollViewアイテム1、2、3、4を表示しています

2)テーブルはGainerボタンを押したために入力されたデータを示しています。

3)グラフはまだ変更していません(後で変更します)。


つまり、向きを変えると、アクティビティが再開されます。したがって、ユーザーが1つの方向でタスクを実行していて、方向を変更すると、進行状況全体が失われます。

アクティビティの状態を保存し、向きが変わったときに復元する必要があることはわかっています。しかし、どこから始めて何を保存すればよいのかわかりません。

どんな助けでも命を救うでしょう!

Scrrenshot

4

1 に答える 1

12

オプション#1:を上書きし、必要な情報を提供されたものに入れonSaveInstanceState()ます。新しいアクティビティインスタンスは、(または)でそれを受け取ります。これを示すサンプルプロジェクトは次のとおりです。ActivityBundleBundleonRestoreInstanceState()onCreate()

オプション#2:をオーバーライドし、状態を表すオブジェクトを返しますonRetainNonConfigurationInstance()Activity新しいアクティビティインスタンスはgetLastNonConfigurationInstance()そのオブジェクトを取得するために呼び出すことができるため、新しいアクティビティはその情報を適用できます。ただし、古いアクティビティが、古いアクティビティへの参照を保持するオブジェクト内の何か(ウィジェット、通常の内部クラスのインスタンスなど)を返さないように注意してください。これを示すサンプルプロジェクトは次のとおりです。

オプション#3:このアクティビティをフラグメントに変換します。setRetainInstance(true);初期設定中にフラグメントがそれ自体を呼び出すようにします。を介してフラグメントを動的にいくつかのアクティビティに追加しFragmentTransactionます。これで、構成が変更されたときにフラグメントが保持されるため、すべてのウィジェットと状態が保持されます。これは、これを示す非常に複雑なサンプルアプリケーションです

これらは、今日推奨されている3つのアプローチです。

于 2011-12-17T13:24:32.300 に答える