3

私は、実行時にいくつかのJSONデータを読むタブを作成する単純なTabActivityを作成しました。現時点では、空のListActivityを各タブのダミーのランダム項目で初期化しています。タブからタブへの変更が機能し、内容が消えないことがわかります。タブの実際のコンテンツはシングルトンクラスに格納されているため、画面の向きが変更されたためにタブアクティビティが再作成されると、インテントの追加バンドルに含まれている識別子に従って、それぞれのリストから正しいダミーアイテムが取得されます。Androidの最初のタブアクティビティは永遠に生きているのはなぜですか?

すべて正常です。私はリストのアクティビティ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メソッドが呼び出されます。そして、ログは私がどのようにタブを切り替えて回転しているかを示します。どのタブが表示されているかによって、異なるアクティビティが再作成されますが、最初のタブが常に表示されます。

最初のタブはいつも再作成されますか?何らかの理由でこの特別な行動が必要ですか?私は、個々のタブを作成TabActivityのループの中でいくつかのより多くのログを入れている、と最初のタブが追加されたときにその活性があるように見えます:私は7

UPDATE HTC伝説のAPIレベルでこれを見ています常にが作成されました。これを避ける方法はありますか?おそらく、ダミーの空のタブを作成し、後に実際のアクティビティを入力しますか?その他のログ:

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 
+2

私は、このオーバーヘッドのハックを避ける方法について誰かが考えているかどうかを知りたいので、これをお気に入りにしました。私が下に書き留めたものに加えて、パフォーマンスを助けるために空の目に見えない第1のタブを実装することを検討しています。 –

+1

私はあなたのアイデアが見えないタブについて考えていたので、ダミーのアクティビティで実装しました。ダミーアクティビティにログを記録すると、デバイスの方向付け中にログが作成/破棄されていることがわかります。そのため、パフォーマンス上の理由から実行する価値があるようです。また、JSONが壊れている場合、ダミーのタブが常に存在するため、タブのアクティビティは空であるためクラッシュしません。アイデアをありがとう。 –

+0

私たちはときどき考えなければならない回避策はありませんか?;) –

答えて

1

アクティビティのライフサイクルメソッドにいくつかのログを入れた後、onCreate()メソッドとonStart()メソッドは常に最初のタブに対して作成されていますが、onResume()メソッドは可視タブに対してのみ呼び出されます。最初のアクティビティがアプリケーションを動かさないように、私は怠惰な初期化コードをonResume()メソッドに入れます。

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

+1

実際、onResume()メソッドに遅延初期化コードを入れるのは悪く、あまり柔軟ではありません。目に見えないタブの実装に関するBillの提案ははるかに優れています。 –

0

初期タブを2..nに変更して、作成されたタブであるかどうかを確認してください。私はそれがAndroidがTabActivityをどのように扱うかと関係があると賭けている。それが本当であれば、あなたはあなたがいるタブを確認することができるかもしれません!= nullと、それを最初のタブとして使うか、またはnullの場合はデフォルトを1にします。

+0

明らかに、アクティビティを設定する前に、タブを追加するときに常にアクティビティが作成されます。 –

+0

これは素晴らしいことです。私のアプリケーションはタブ付きのインターフェースを使用していますが、最初のタブは過度に負担がかかりませんが、何度も再インスタンス化されていることを考慮する価値はあります。私のアプリは、最初のタブのメモリ内キャッシュを利用するのに役立ちますので、そこから始めましょう;)ありがとう。 –

関連する問題