3

いくつかの JSON データを読み取る実行時にタブを作成する単純な TabActivity を作成しました。現時点では、タブからタブへの変更が機能し、コンテンツが消えないことを確認するために、各タブのダミーのランダム項目で空の ListActivity を初期化しています。タブの実際のコンテンツはシングルトン クラスに保存されるため、画面の向きの変更によりタブ アクティビティが再作成されると、インテントのエクストラ バンドルに含まれる識別子に従って、それぞれのリストから正しいダミー アイテムを取得するだけです。 .

すべて正常に動作します。画面の回転時にアクティビティが再作成されるのを監視するために、リスト アクティビティの onCreate メソッドにログを記録しました。ただし、最初のタブのアクティビティは、表示されていなくても常に再作成されるという奇妙な点があります。3 番目または 4 番目のタブに切り替えてデバイスを回転させると、最初のタブを除いて、以前のタブは強制終了され、再作成されません。最初のタブは常にそこにあります。なんで?コードのバグは理解できますが、タブ アクティビティはチュートリアルからコピーされ、リスト アクティビティはすべてのタブで同じです。ここに私が得るいくつかのログがあります:

List created with 1
onConfigurationChanged
List created with 1
List created with 2
List created with 4
List created with 5
List created with 6
onConfigurationChanged
List created with 1
List created with 6
onConfigurationChanged
List created with 1
List created with 6
onConfigurationChanged
List created with 1
onConfigurationChanged
List created with 1
List created with 2
onConfigurationChanged
List created with 1
List created with 2
onConfigurationChanged
List created with 1
List created with 2
List created with 4
onConfigurationChanged
List created with 1
List created with 4
onConfigurationChanged
List created with 1
List created with 4
List created with 5
onConfigurationChanged
List created with 1
List created with 5
onConfigurationChanged
List created with 1
List created with 5

ログからわかるように、各リスト アクティビティはエクストラ バンドルに入れられた識別子をログに記録し、それ以外はほとんど何もしません。アプリケーションが起動し、最初のタブが作成されたら、回転して他のタブに切り替えます。それらの onCreate メソッドが呼び出されます。そして、ログは、タブを切り替えて回転する方法を示しています。表示されているタブに応じてさまざまなアクティビティが再作成されますが、最初のアクティビティは常にそこにあります。

最初のタブが常に再作成されるのはなぜですか? この特別な動作は何らかの理由で必要ですか? これは HTC Legend API レベル 7 で見られます。

更新: 個々のタブを作成する TabActivity のループにいくつかのログを追加しました。最初のタブが追加されると、そのアクティビティが常に作成されるように見えます。これを回避する方法はありますか?ダミーの空のタブを作成し、後で実際のアクティビティを入力することはできますか? いくつかのログ:

onConfigurationChanged
Tab: Saving tab index 3
...
Tab: Adding tab 1
List created with 1
Tab: Adding tab 2
Tab: Adding tab 3
Tab: Adding tab 4
Tab: Adding tab 5
Tab: Setting tab to index 3
List created with 5
4

2 に答える 2

1

アクティビティのライフサイクルメソッドにさらにログを追加した後、onCreate()メソッドとonStart()メソッドは常に最初のタブに対して作成されますが、onResume()メソッドは表示されているタブに対してのみ呼び出されることがわかりました。そのため、怠惰な初期化コードをonResume()メソッドに配置して、最初のアクティビティがアプリケーションを停止させないようにします。

おそらく、TabActivityはhttp://developer.android.com/reference/android/widget/ViewFlipper.htmlと同様の方法で内部的に機能します。そのため、最初のタブアクティビティは、表示されていなくても常に作成されます。

于 2011-06-09T13:07:24.787 に答える
0

最初のタブを 2..n に変更してみて、それが作成されるタブかどうかを確認してください。Android が TabActivity を処理する方法に関係があるに違いありません。それが真の場合、 != null でどのタブを使用しているかを確認し、それを最初のタブとして使用するか、null の場合はデフォルトで 1 にすることができます。

于 2011-06-09T11:28:17.650 に答える