Frage Aktivität Neustart bei Rotation Android


In meiner Android-Anwendung, wenn ich das Gerät rotiere (rutsche die Tastatur aus) dann meine Activity wird neu gestartet (onCreate wird genannt). Nun, das ist wahrscheinlich so, wie es sein sollte, aber ich mache eine Menge Vorbereitungen in der onCreate Methode, also brauche ich entweder:

  1. Legen Sie die Ersteinrichtung in eine andere Funktion, so dass bei der Gerätedrehung nicht alles verloren geht oder
  2. Mach es so onCreate wird nicht erneut aufgerufen und das Layout passt sich an oder an
  3. Begrenzen Sie die App nur auf das Porträt onCreate wird nicht aufgerufen.

1222
2018-01-19 00:28


Ursprung


Antworten:


Verwenden der Anwendungsklasse

Je nachdem, was Sie bei der Initialisierung tun, können Sie eine neue Klasse erstellen, die erweitert wird Application und verschiebe deinen Initialisierungscode in einen überschriebenen Code onCreate Methode innerhalb dieser Klasse.

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

Das onCreate in der Anwendungsklasse wird nur aufgerufen, wenn die gesamte Anwendung erstellt wird, so dass die Aktivität neu gestartet wird, wenn Änderungen an der Ausrichtung oder Tastatursichtbarkeit nicht ausgelöst werden.

Es empfiehlt sich, die Instanz dieser Klasse als Singleton verfügbar zu machen und die Anwendungsvariablen, die Sie initialisieren, mithilfe von Getter und Setter anzuzeigen.

HINWEIS: Sie müssen den Namen Ihrer neuen Application-Klasse im Manifest angeben, damit sie registriert und verwendet werden kann:

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

Reagieren auf Konfigurationsänderungen  [UPDATE: Dies ist seit API 13 veraltet; Siehe die empfohlene Alternative]

Als weitere Alternative können Sie Ihre Anwendung auf Ereignisse aufmerksam machen lassen, die zu einem Neustart führen würden - z. B. Ausrichtung und Änderungen der Tastatursichtbarkeit - und diese in Ihrer Aktivität behandeln.

Beginnen Sie mit dem Hinzufügen der android:configChanges Knoten zum Manifestknoten Ihrer Aktivität

android:configChanges="keyboardHidden|orientation"

oder für Android 3.2 (API Level 13) und neuer:

android:configChanges="keyboardHidden|orientation|screenSize"

Dann überschreibe innerhalb der Aktivität die onConfigurationChanged Methode und Anruf setContentView um das GUI-Layout in der neuen Ausrichtung zu wiederholen.

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

896
2018-01-19 08:47



Update für Android 3.2 und höher:

Vorsicht: Beginnend mit Android 3.2 (API Level 13), Die "Bildschirmgröße" ändert sich ebenfalls wenn das Gerät zwischen Hoch- und Querformat wechselt. Wenn Sie also bei der Entwicklung für die API-Stufe 13 oder höher (wie von den Attributen minSdkVersion und targetSdkVersion deklariert) die Laufzeitwiederherstellung aufgrund von Orientierungsänderungen verhindern möchten, müssen Sie die Option einschließen "screenSize" Wert neben dem "orientation" Wert. Das heißt, Sie müssen erklären android:configChanges="orientation|screenSize". Wenn Ihre Anwendung jedoch auf die API-Stufe 12 oder niedriger abzielt, verarbeitet Ihre Aktivität diese Konfigurationsänderung immer selbst (diese Konfigurationsänderung startet Ihre Aktivität nicht neu, selbst wenn sie auf einem Gerät mit Android 3.2 oder höher ausgeführt wird).


175
2018-03-03 21:56



Anstatt zu versuchen, das zu stoppen onCreate() wenn man überhaupt gefeuert wird, versuche vielleicht, das zu überprüfen Bundle  savedInstanceState in das Ereignis übergeben werden, um zu sehen, ob es null ist oder nicht.

Zum Beispiel, wenn ich eine Logik habe, die ausgeführt werden soll, wenn der Activity ist wirklich erstellt, nicht bei jeder Orientierung Veränderung, ich nur diese Logik in der onCreate()nur wenn der savedInstanceState ist Null.

Ansonsten möchte ich, dass das Layout für die Ausrichtung korrekt neu gezeichnet wird.

public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_game_list);

        if(savedInstanceState == null){
            setupCloudMessaging();
        }
}

nicht sicher, ob dies die ultimative Antwort ist, aber es funktioniert für mich.


110
2017-08-04 21:04



Was ich getan habe...

im Manifest zum Aktivitätsabschnitt hinzugefügt:

android:configChanges="keyboardHidden|orientation"

im Code für die Aktivität implementiert:

//used in onCreate() and onConfigurationChanged() to set up the UI elements
public void InitializeUI()
{
    //get views from ID's
    this.textViewHeaderMainMessage = (TextView) this.findViewById(R.id.TextViewHeaderMainMessage);

    //etc... hook up click listeners, whatever you need from the Views
}

//Called when the activity is first created.
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    InitializeUI();
}

//this is called when the screen rotates.
// (onCreate is no longer called when screen rotates due to manifest, see: android:configChanges)
@Override
public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.main);

    InitializeUI();
}

93
2018-01-04 01:26



Was Sie beschreiben, ist das Standardverhalten. Sie müssen diese Ereignisse selbst erkennen und behandeln, indem Sie Folgendes hinzufügen:

android:configChanges

zu Ihrem Manifest und dann die Änderungen, die Sie behandeln möchten. Zur Orientierung würden Sie verwenden:

android:configChanges="orientation"

und für das Öffnen oder Schließen der Tastatur würden Sie verwenden:

android:configChanges="keyboardHidden"

Wenn Sie beides behandeln möchten, können Sie sie einfach mit dem Pipe-Befehl trennen:

android:configChanges="keyboardHidden|orientation"

Dies löst die onConfigurationChanged-Methode in jeder Aktivität aus, die Sie aufrufen. Wenn Sie die Methode überschreiben, können Sie die neuen Werte übergeben.

Hoffe das hilft.


57
2018-01-19 02:28



Ich habe gerade diese Überlieferung entdeckt:

Die Aktivität durch eine Orientierungsänderung am Leben erhalten und durcharbeiten onConfigurationChanged, die Dokumentation und das Codebeispiel oben schlage das in der Manifest-Datei vor:

android:configChanges="keyboardHidden|orientation"

Das hat den zusätzlichen Vorteil, dass es immer funktioniert.

Die Bonus-Geschichte ist das Auslassen der keyboardHidden mag logisch erscheinen, aber es verursacht Fehler im Emulator (zumindest für Android 2.1): nur spezifizieren orientation wird den Emulator beide aufrufen lassen OnCreate und onConfigurationChanged manchmal und nur OnCreate anderen Zeiten.

Ich habe den Fehler auf einem Gerät nicht gesehen, aber ich habe gehört, dass der Emulator für andere versagt hat. Es lohnt sich also, zu dokumentieren.


39
2017-12-22 21:50



Sie können auch die Möglichkeit in Betracht ziehen, die Android-Plattform für die Speicherung von Daten über Orientierungsänderungen hinweg zu verwenden: onRetainNonConfigurationInstance() und getLastNonConfigurationInstance().

Auf diese Weise können Sie Daten über Konfigurationsänderungen hinweg beibehalten, z. B. Informationen, die Sie möglicherweise von einem Server-Abruf oder einem anderen berechneten Wert erhalten haben onCreate oder seit, während auch Android Ihr Layout neu zu gestalten Activity Verwenden Sie die XML-Datei für die Ausrichtung, die jetzt verwendet wird.

Sehen Hier oder Hier.

Es sollte angemerkt werden, dass diese Methoden nun veraltet sind (obwohl sie immer noch flexibler sind als die Handhabung von Orientierungsänderungen, wie die meisten der obigen Lösungen vorschlagen), mit der Empfehlung, zu der jeder wechselt Fragments und stattdessen verwenden setRetainInstance(true) auf jeder Fragment Sie möchten behalten.


33
2017-09-22 03:03



Der Ansatz ist nützlich, aber unvollständig, wenn Fragmente verwendet werden.

Fragmente werden normalerweise bei Konfigurationsänderungen neu erstellt. Wenn Sie dies nicht wünschen, verwenden Sie

setRetainInstance(true); in den Konstruktoren des Fragments

Dies bewirkt, dass Fragmente während der Konfigurationsänderung beibehalten werden.

http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)


28
2017-09-21 09:09