Android、デバイスを回転させたときにアクティビティを破棄しない方法は?


81

ポートレートモードでのみ動作するアプリがあり、すべてのアクティビティのマニフェストファイルに、向きがポートレートになるように変更を加えました。しかし、デバイスを回転させると、アクティビティが再び作成されます。活動を破壊しない方法は?


1
これはしばしば推奨されません。次のようなプログラムでアプリケーションの向きを設定してみてください。setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
ステルスコプター2010

7
なぜ反対するのでしょうか?実行に2秒かかるサービスがあるとしましょう。アクティビティが毎回破棄される場合、そのサービスは1回だけ実行する必要がある間、毎回実行され続けます。
モハメドマンスール

回答:


131

以下のためのAPI 12以下:アドオン

android:configChanges="orientation"

API 13以降をターゲットにしている場合は、「screenSize」を追加します。向きが変わると画面サイズも変わるため、そうしないと、新しいデバイスが引き続きアクティビティを破壊してしまいます。「screenSize」の使用の詳細については、以下のEggの回答を参照してください。

android:configChanges="orientation|screenSize"

AndroidManifest.xmlのアクティビティに追加します。このようにして、アクティビティが自動的に再開されることはありません。詳細については、ドキュメントを参照しください


アクティビティが再開されます。アクティビティが実質的に回転していなくても、アクティビティが回転するときに実行する必要があるすべてのことを実行する意味がわかりません。センサーが回転についてOSに送信するメッセージなどを無効にして、この問題を根本から修正する方法はありますか?
Vasil 2010

6
どのデバイスでプログラミングしていますか?たとえば、キーボードをスライドさせるとアクティビティが再開される可能性があることを忘れないでください...(それが理由でconfChangesを "keyboard | KeyboardHidden | orientation"に設定する場合)

2
これにより、レイアウトの変更が無効になります。どうすれば修正できますか?
remian8985 2015

1
このソリューションは、破棄および作成アクティビティを解決しますが、レイアウトの変更を処理する方法を解決します。つまり、向きを変更すると、対応するレイアウトが読み込まれます。
sandeepmaaram 2015

マニフェストファイルではなく、プログラムでandroid:configChangesパラメーターを設定する方法はありますか?
CodyF 2016

108

フルリンが言った公式文書から、

注:アプリケーションがAPIレベル13以上(minSdkVersion属性とtargetSdkVersion属性で宣言されている)をターゲットにしている場合は、デバイスが縦向きと横向きを切り替えるときにも変更されるため、「screenSize」構成も宣言する必要があります。

したがって、アプリがAPIレベル13以上を対象としている場合は、代わりに次の構成を設定する必要があります。

android:configChanges="orientation|screenSize"


4
どうもありがとうございます!他のすべての答えは、APIレベル13がこのscreenSizeを導入する部分を見逃しています。あなたは私の命を救った!:)
タマーシュバルタ2012

1
@eggありがとうございます!:)これは役に立ちました!
KarenAnne 2013年

1
あなたがパートタイムでそれをするとき、素晴らしいヒントはドキュメントに追いつくのが難しいです。
wallerjake 2013年

1
+1ナイスタッチマン。このソリューションを共有していただきありがとうございます。あなたは私の日を救った。ありがとう;)
Simon Dorociak 2014

9

正しい解決策は

android:configChanges="orientation|screenSize"

Androidのドキュメント:

現在利用可能な画面サイズが変更されました。これは、現在のアスペクト比に対する現在利用可能なサイズの変化を表すため、ユーザーが横向きと縦向きを切り替えると変化します。ただし、アプリケーションがAPIレベル12以下を対象としている場合、アクティビティは常にこの構成変更自体を処理します(この構成変更は、Android 3.2以降のデバイスで実行されている場合でも、アクティビティを再開しません)。*


5

私はこれを少し混乱させてから、マニフェストファイル内でconfigChangesをアクティビティレベルではなくアプリケーションレベルに配置していることを確認しました。これが私にとって正しく機能しているときのコードの様子です。

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
                  android:configChanges="orientation|screenSize|keyboardHidden">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity> 
</application> 

2
画像ではなく、投稿内でコードを共有する必要があります。
ジュールデュポン2018

投稿を編集して、実際のマニフェストコードをスクリーンショットではなくテキストとして表示してください。他の人はあなたの画像からコピーして貼り付けることができません。詳細はこちらをご覧ください。ありがとうございました。
パン

1

Androidが分割画面(Android用語では「マルチウィンドウ」)をサポートするようになったので、screenSize | smallestScreenSize | screenLayout | orientationも追加することをお勧めします。したがって、回転と分割画面を処理するには、android:configChangesで次のようなものが必要になります

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
                  android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity> 
</application>


-1

マニフェストに書き込む:

android:configChanges="orientation|screenSize|keyboardHidden"

問題を解決したアクティビティでこれをオーバーライドします。

 @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
}

5
onConfigurationChangedメソッドをオーバーライドし、元の実装を呼び出して何か便利なことを行うのはなぜですか?
ricosrealm 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.