問題

私のAndroidアプリケーションでは、デバイスを回転させると(キーボードをスライドさせる)、Activityが再起動されます(onCreateが呼び出されます)。さて、これはおそらくそれがどうあるべきかですが、私はonCreateメソッドで多くの初期設定を行うので、どちらかが必要です:

  1. すべての初期設定を別の関数に入れて、デバイスの回転時にすべてが失われるわけではありません。
  2. onCreateが再び呼び出されず、レイアウトが調整されるか、
  3. onCreateが呼び出されないように、アプリをポートレートに制限します。

  ベストアンサー

アプリケーションクラスの使用

初期化で何をしているかによって、Application を拡張し、初期化コードをそのクラス内のオーバーライドされた onCreate メソッドに移動する新しいクラスを作成することを検討できます。

 public class MyApplicationClass extends Application {
  @Override
  public void onCreate() {
    super.onCreate();
    // TODO Put your application initialization code here.
  }
}
 

アプリケーションクラスのonCreateは、アプリケーション全体が作成されたときにのみ呼び出されるため、アクティビティが向きで再起動するか、キーボードの可視性が変更されてもトリガーされません。

このクラスのインスタンスをシングルトンとして公開し、ゲッターとセッターを使用して初期化しているアプリケーション変数を公開することをお勧めします。

注意: 新しいアプリケーションクラスの名前をマニフェストに指定して登録して使用する必要があります。

 <application
    android:name="com.you.yourapp.MyApplicationClass"
 

構成の変更に反応する [更新:これはAPI 13以降非推奨です。 は推奨される代替を参照してください

さらに別の方法として、アプリケーションにオリエンテーションやキーボードの可視性の変更などの再起動を引き起こすイベントをリッスンさせ、アクティビティ内で処理させることができます。

まず、アクティビティのマニフェストノードに android:configChanges ノードを追加します。

  <activity android:name=".MyActivity"
      android:configChanges="orientation|keyboardHidden"
      android:label="@string/app_name">
 

または Android 3.2(APIレベル13)と新しいの場合:

 <activity android:name=".MyActivity"
      android:configChanges="keyboardHidden|orientation|screenSize"
      android:label="@string/app_name">
 

次に、アクティビティ内でonConfigurationChangedメソッドをオーバーライドし、setContentViewを呼び出してGUIレイアウトを新しい方向に強制的に再実行します。

 @Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
  setContentView(R.layout.myLayout);
}
 

  同じタグがついた質問を見る

androidrotationandroid-activity