3

TabActivity他の 3 つのアクティビティをホストするがあります。

最初のタブが選択されている場合は、デバイスの向きを変更でき、すべて問題ありません。

2 番目または 3 番目のタブに移動して方向を変更すると、タブ サブ アクティビティの (2 番目と 3 番目の)onCreate()メソッドが 2 回呼び出され、最初は既定のタブ コンテンツ (最初のタブ) を設定し、2 番目の onCreate で、選択したタブのコンテンツを設定しています(初めての場合)。

メソッドが 2 回呼び出されるのはなぜonCreate()ですか? どうすれば問題を解決できますか?

編集:

android:configChanges="orientation"アプリのタイトルとシステムバーを下げて縦向きに表示したいので、マニフェストで使用したくありません。これは、コンテンツを設定する前にのみ可能です...

4

3 に答える 3

1

明確にするために、異なる向き (縦または横) を使用している複数のタブがあり、タブを切り替えて対応する向きを適切に設定するときに問題が発生していると言っていますか?

カタのコメントに応えて:

はい、画面を回転させるたびに、現在表示可能なアクティビティが破棄され、onCreate が再度呼び出されます (手順を思い出した場合)。タブを表す int 値を返す getCurrentTab() を呼び出し、onCreate が呼び出されたときにそれをアクティブなタブとしてリセットする必要があります。これはいくつかの方法で行うことができます...それを処理する小さなメソッドを作成して onCreate 経由で呼び出すか、onSaveInstanceState(Bundle) を使用して現在のデータを保存し、onRestoreInstanceState() を使用してタブ データをリロードします。

onCreate() で設定するのではなく、グローバル int (int currentTab = 0) を設定できます。onSaveInstanceState(Bundle) メソッドで、それを現在のタブに保存し (currentTab = getCurrentTab())、次に onRestoreInstanceState() で保存できます。再設定できます。

それは理にかなっていますか?

私はそれをテストしていませんが、これらの 2 つのメソッド呼び出しに慣れていない場合は、喜んでテストしたことを覚えておいてください。

以下はデータを Bundle に保存する例です。onCreate がそのアクティビティ バンドルをパラメーターとして受け入れることも思い出してください。

@Override
public void onSaveInstanceState(Bundle outState){
    // Store UI state to the savedInstanceState.
    // This bundle will be passed to onCreate on next call.
    super.onSaveInstanceState(outState);
    String strMinSec = timer.getText().toString();
    String strMs = timerMs.getText().toString();
    long curElapstedTime = elapsedTime;
    boolean timerStopped = stopped;
    int orientation = this.getResources().getConfiguration().orientation;

    outState.putString("MinSec", strMinSec);
    outState.putString("Ms", strMs);
    outState.putLong("Elapsed", elapsedTime);
    outState.putBoolean("Stopped", timerStopped);
    outState.putInt("Orientation", orientation);
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState){

    // Restore UI state from the savedInstanceState.
    if (savedInstanceState != null){
        String MinSec = savedInstanceState.getString("MinSec");
        if (MinSec != null)
        {
          timer.setText(MinSec);
        }
        String Ms = savedInstanceState.getString("Ms");
        if (Ms != null)
        {
          timerMs.setText(Ms);
        }
        long elapsed = savedInstanceState.getLong("Elapsed");
        if(elapsed > 0)
            elapsedTime = elapsed;
        int theOrientation = savedInstanceState.getInt("Orientation");
        //if(theOrientation > 0)
            //this.setRequestedOrientation(theOrientation); 
    }
}
于 2011-11-12T00:12:48.303 に答える
1

android:configChanges="orientation"以下のようにマニフェストファイルで属性を使用します

<activity android:name=".Settings" android:screenOrientation="portrait"
            android:configChanges="orientation"></activity>
于 2011-11-04T13:38:52.350 に答える
0

Activity最良の解決策は、単一のタブを使用して別のアプローチを取り、すべてのタブのコンテンツを別のタブLinearLayoutonClick()メソッド (いくつかのボタンになります) に配置して、レイアウトを切り替えることだと思います...

誰かがより良いアイデアを持っている場合は、ここに投稿してください!

ありがとうございました!

于 2011-11-13T16:29:07.003 に答える