1. ホーム
  2. android

[解決済み] Androidのローテーションでアクティビティを再開する

2022-03-17 04:38:45

質問

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 は、アプリケーション全体の作成時にのみ呼び出されるため、方向やキーボードの可視性の変更に伴うActivityの再スタートは、これをトリガーにしない。

このクラスのインスタンスをシングルトンとして公開し、初期化するアプリケーション変数をゲッターとセッターを使って公開するのは良い習慣です。

注: 新しい Application クラスを登録して使用するには、マニフェストでその名前を指定する必要があります。

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

設定変更への対応 [UPDATE: これはAPI 13以降非推奨です。 推奨される代替手段を参照してください。 ]

さらに、アプリケーションが再起動するようなイベント(方向やキーボードの可視性の変化など)をリッスンして、Activityの中で処理することも可能です。

まず 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">

そしてActivityの中で onConfigurationChanged メソッドを呼び出し setContentView を使用して、GUIレイアウトを新しい方向で再実行することを強制します。

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