私の Android アプリケーションでは、デバイスを回転させると (キーボードをスライドさせると)、 がActivity
再起動されます (onCreate
が呼び出されます)。 さて、これはおそらく正しい動作ですが、 メソッド内で多くの初期設定を行うためonCreate
、次のいずれかが必要です。
- 初期設定をすべて別の機能にまとめておくと、デバイスの回転や
- 再度呼び出されないようにして
onCreate
、レイアウトを調整するか、 onCreate
呼び出されないように、アプリをポートレートのみに制限します。
ベストアンサー1
アプリケーションクラスの使用
初期化で何を行うかに応じて、拡張する新しいクラスを作成しApplication
、初期化コードをonCreate
そのクラス内のオーバーライドされたメソッドに移動することを検討できます。
Kotlin バージョン
class MyApplicationClass: Application {
@override fun onCreate() {
super.onCreate()
// Put your application initialization code here
}
}
Javaバージョン
public class MyApplicationClass extends Application {
@Override
public void onCreate() {
super.onCreate();
// Put your application initialization code here
}
}
アプリケーション クラスのはonCreate
、アプリケーション全体が作成されたときにのみ呼び出されるため、方向の変更やキーボードの表示の変更によってアクティビティが再起動されても、これはトリガーされません。
このクラスのインスタンスをシングルトンとして公開し、ゲッターとセッターを使用して初期化するアプリケーション変数を公開することをお勧めします。
注: 新しい Application クラスを登録して使用するには、マニフェストでそのクラスの名前を指定する必要があります。
<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 レイアウトを新しい方向で強制的に再実行します。
Kotlin バージョン
@override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
setContentView(R.layout.myLayout)
}
Javaバージョン
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setContentView(R.layout.myLayout);
}