20 Stimmen

Android - Wechsel zwischen Landschafts- und Portraitmodus lässt Intent Werte verlieren

Ich verwende Intents, um zwischen Aktivitäten in meiner Android-App zu wechseln. Ich lege Daten im Intent ab, die in der nächsten Aktivität verwendet werden sollen. Wenn ich das Telefon zwischen Quer- und Hochformat wechsle, gehen die Werte, die vom Intent übergeben werden, verloren, und ich erhalte eine NullPointerException.

Kann mir bitte jemand sagen, was falsch sein könnte.

Es gibt viel Code, um ihn vollständig zu posten. Aber wenn jemand bestimmte Teile des Codes sehen muss, kann ich ihn hier posten.

Bearbeiten
Ich habe das Problem des nicht gespeicherten Zustands gelöst. Aber ein weiteres Problem, dem ich gegenüberstehe, ist, dass nachdem die Ausrichtung geändert wurde, keine der Tasten auf dem Bildschirm funktioniert. Beim Drücken einer Taste erhalte ich diese Warnung im LogCat

02-25 23:07:49.190: WARN/WindowManager(58): Kein Fenster, um Aktion 0 zu verteilen

Bitte helfen Sie.

25voto

Quintin Robinson Punkte 78652

Wenn Sie die Orientierung ändern, wird die Aktivität neu erstellt und onCreate wird erneut aufgerufen. Daher müssen Sie das Bundle verwenden, um Ihren aktuellen Zustand zu speichern und nach einer Orientierungsänderung wiederherzustellen. Wenn Sie nur eine App mit einem TextView haben und Text eingeben und die Orientierung ändern, können Sie dies in Aktion sehen. Wenn Sie Ihren Zustand für onCreate bündeln, können Sie dies einschränken. Dies ist wahrscheinlich auch der Grund, warum Sie nach den Orientierungsänderungen einen NullPointer haben. Es ist nervig wie die Hölle, aber etwas, mit dem wir leben müssen.

Dieser Link zu einer Reihe von Orientierungstutorials und dieser erste sollte Ihnen helfen, genau zu verstehen, was passiert und wie Sie Ihren aktuellen Zustand erfolgreich beibehalten können.

Aktualisierung: Es gibt auch einen Beitrag auf SO Activity restart on rotation Android, der sich mit fast demselben Thema befasst.

Bearbeitung für die Nachfrage:

Haben Sie Ihre Klick-Handler nach der Orientierungsänderung erneut angehängt?

0 Stimmen

Warum die letzte Frage? Ist es wichtig, Zuhörer erneut anzuhängen? Lass es mich wissen. :)

0 Stimmen

Ja, denn wenn du sie nicht erneut anbringst, werden sie immer noch an den alten Schaltflächen befestigt sein, die nicht mehr existieren.

1 Stimmen

+1 Danke! Ich stecke seit einer Stunde in diesem Fehler fest. Ich habe wirklich begonnen, die Android-Entwicklung zu verabscheuen! Es kompliziert banale Dinge.

9voto

Hulk Punkte 2559

Schreiben Sie dies in Ihrer Manifestdatei..in welcher Aktivität Sie dies möchten--

 android:configChanges="orientation|keyboardHidden"

Bearbeitet: Verwenden Sie diese für neue API-Versionen--

android:configChanges="orientation|keyboardHidden|screenSize"

Es wird auf jeden Fall funktionieren..

0 Stimmen

Dies wurde im Emulator bearbeitet. Funltionierte jedoch nicht auf dem echten Gerät.

0 Stimmen

Das wird auch auf einem echten Gerät funktionieren. Stellen Sie sicher, dass Sie dies in der Aktivität hinzugefügt haben, bei der das Problem auftritt.

5voto

Versuchen Sie dies:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString(SOME_KEY, "blah blah blah");
}

@Override
public void onCreate(Bundle savedInstanceState) {
   ...
   somevalue = savedInstanceState.getString(SOME_KEY);
   ...
}

3voto

Nadav Daniel Punkte 41

Es ist möglich, ein Attribut android:configChanges mit dem Wert "orientation" zu deklarieren, dies verhindert, dass die Aktivität neu gestartet wird. Stattdessen bleibt die Aktivität weiterhin aktiv, und ihre onConfigurationChanged() Methode wird aufgerufen.

0 Stimmen

Fügen Sie dies dem Aktivitäts-Tag hinzu

1voto

Nguyen Minh Binh Punkte 22811

Erklären Sie < android:configChanges="orientation|keyboardHidden"/> in Ihrem Manifest. Dies ermöglicht es Ihnen, die Änderung der Ausrichtung/Tastatur-Sichtbarkeit selbst zu verwalten. Natürlich müssen Sie die Rückrufmethode nicht überschreiben, um sie zu verwalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X