Android, wie kann ich die Aktivität nicht zerstören, wenn ich das Gerät drehe?

80

Ich habe eine App, die nur im Hochformat funktioniert, und ich habe die Änderungen in meiner Manifestdatei für jede Aktivität so vorgenommen, dass die Ausrichtung Hochformat ist. Wenn ich das Gerät drehe, wird die Aktivität erneut erstellt. Wie kann man die Aktivität nicht zerstören?

Vasil
quelle
1
Dies wird häufig davon abgeraten. Sie können versuchen, die Ausrichtung Ihrer Anwendungen programmgesteuert festzulegen, indem Sie Folgendes festlegen: setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
Stealthcopter
7
Warum sollte es dagegen sein? Angenommen, wir haben einen Dienst, dessen Ausführung 2 Sekunden dauert. Wenn die Aktivität jedes Mal zerstört wird, wird dieser Dienst jedes Mal ausgeführt, während ich ihn nur einmal ausführen muss.
Mohamed Mansour

Antworten:

130

Für API 12 und niedriger : Hinzufügen

android:configChanges="orientation"

Fügen Sie "screenSize" hinzu, wenn Sie auf API 13 oder höher abzielen , da neue Geräte Ihre Aktivität weiterhin zerstören, wenn sich Ihre Ausrichtung und Ihre Bildschirmgröße ändern. Weitere Informationen zur Verwendung von "screenSize" finden Sie in der Antwort von Egg unten.

android:configChanges="orientation|screenSize"

zu Ihrer Aktivität in AndroidManifest.xml. Auf diese Weise wird Ihre Aktivität nicht automatisch neu gestartet. Weitere Informationen finden Sie in der Dokumentation

Herausforderung angenommen
quelle
Die Aktivität wird erneut gestartet. Ich weiß nicht, wozu all die Dinge zu tun sind, die getan werden müssen, wenn sich die Aktivität dreht, auch wenn sie sich nicht virtuell dreht. Gibt es eine Möglichkeit, die Nachrichten zu deaktivieren, die der Sensor über die Rotation an das Betriebssystem sendet, oder so etwas, um dieses Problem von der Wurzel aus zu beheben?
Vasil
6
Auf welchem ​​Gerät programmieren Sie? Denken Sie daran, dass zum Beispiel das Herausziehen der Tastatur auch Ihre Aktivität neu starten kann ... (wenn dies der Grund ist, setzen Sie confChanges auf "keyboard | keyboardHidden | Orientierung")
2
Dies deaktiviert die Layoutänderung. Wie behebe ich das?
Remian8985
1
Diese Lösung behebt das Zerstören und Erstellen von Aktivitäten, aber den Umgang mit Layoutänderungen. Ich will sagen, wann sich die Ausrichtung ändert, das entsprechende Layout wird geladen.
Sandeepmaaram
Gibt es eine Möglichkeit, den Parameter android: configChanges programmgesteuert im Gegensatz zur Manifestdatei festzulegen?
CodyF
108

Aus dem offiziellen Dokument sagte Flurin:

Hinweis: Wenn Ihre Anwendung auf API-Level 13 oder höher abzielt (wie durch die Attribute minSdkVersion und targetSdkVersion deklariert), sollten Sie auch die Konfiguration "screenSize" deklarieren, da sie sich auch ändert, wenn ein Gerät zwischen Hoch- und Querformat wechselt.

Wenn Ihre App auf API-Level 13 oder höher abzielt, sollten Sie stattdessen diese Konfiguration festlegen:

android:configChanges="orientation|screenSize"

Ei
quelle
4
Ich danke dir sehr! Bei allen anderen Antworten fehlt der Teil, in dem API Level 13 dieses ScreenSize-Ding einführt. Du hast mir gerade das Leben gerettet! :)
Tamás Barta
1
@egg Dankeuuuuuu! :) Das hat geholfen!
KarenAnne
1
Toller Tipp, es ist schwierig, mit der Dokumentation Schritt zu halten, wenn Sie dies in Teilzeit tun.
Wallerjake
1
+1 Netter Mann. Vielen Dank, dass Sie diese Lösung für uns freigegeben haben. Du hast meinen Tag gerettet. Danke;)
Simon Dorociak
9

Die richtige Lösung ist

android:configChanges="orientation|screenSize"

Android-Dokumentation:

Die aktuell verfügbare Bildschirmgröße hat sich geändert. Dies stellt eine Änderung der derzeit verfügbaren Größe im Verhältnis zum aktuellen Seitenverhältnis dar und ändert sich, wenn der Benutzer zwischen Quer- und Hochformat wechselt. Wenn Ihre Anwendung jedoch auf API-Stufe 12 oder niedriger abzielt, behandelt Ihre Aktivität diese Konfigurationsänderung immer selbst (diese Konfigurationsänderung startet Ihre Aktivität nicht neu, selbst wenn sie auf einem Android 3.2-Gerät oder höher ausgeführt wird). *

er_benji
quelle
5

Ich habe dies ein wenig durcheinander gebracht und dann erneut festgestellt, dass ich in der Manifest-Datei die configChanges auf Anwendungsebene und nicht auf Aktivitätsebene platziert habe. So sieht der Code aus, wenn er für mich richtig funktioniert.

<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> 
Superheld
quelle
2
Sie sollten Code in Ihrem Beitrag anstelle eines Bildes freigeben.
Jules Dupont
Bitte bearbeiten Sie Ihren Beitrag und zeigen Sie den tatsächlichen Manifestcode als Text anstelle von Screenshots an. Andere können Ihre Bilder nicht kopieren und einfügen. Siehe hier für Details. Vielen Dank.
Pang
1

Jetzt, da Android geteilten Bildschirm unterstützt ("Multi-Window" im Android-Sprachgebrauch), möchten Sie wahrscheinlich auch screenSize | smallScreenSize | screenLayout | Ausrichtung hinzufügen. Um Rotation und geteilten Bildschirm zu handhaben, sollten Sie in Android: configChanges so etwas tun

<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>
pkoepke
quelle
-1

schreibe in Manifest:

android:configChanges="orientation|screenSize|keyboardHidden"

und überschreiben Sie dies in Aktivitäten, die Ihr Problem gelöst haben:

 @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
}
Mojtaba
quelle
5
Warum sollte das Überschreiben der onConfigurationChanged-Methode und das Aufrufen der ursprünglichen Implementierung etwas Nützliches bewirken?
Ricosrealm