webentwicklung-frage-antwort-db.com.de

Android - Beim Wechsel zwischen Quer- und Hochformatmodus verliert Intent an Werten

Ich benutze Intents, um zwischen Aktivitäten in meiner Android-App zu wechseln. Ich lege Daten in die Absicht, um sie in der nächsten Aktivität verwenden zu können. Wenn ich das Telefon zwischen Querformat und Hochformat umschalte, gehen die von der Absicht übergebenen Werte verloren und ich bekomme eine NullPointerException.

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

Es gibt eine Menge Code, um es vollständig zu posten. Wenn jedoch jemand bestimmte Teile des Codes betrachten muss, kann ich ihn hier posten.

Bearbeiten
Ich habe das Problem gelöst, dass der Staat nicht gerettet wird. Ein anderes Problem war jedoch, dass keine der Schaltflächen auf dem Bildschirm funktioniert, nachdem die Ausrichtung geändert wurde. Beim Drücken der Taste bekomme ich diese Warnung in LogCat

02-25 23:07:49.190: WARN/WindowManager(58): No window to dispatch pointer action 0

Bitte helfen.

19
lostInTransit

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

Dieser - Link zu einer Reihe von Orientierungs-Tutorials und dieser erste insbesondere soll Ihnen helfen, genau zu verstehen, was los ist und wie Sie Ihren aktuellen Status erfolgreich beibehalten können.

Update: Es gibt auch einen Beitrag über SO Aktivitätsneustart bei Rotation Android , der fast dasselbe behandelt.

Bearbeiten für Folgefrage:

Haben Sie Ihre Klick-Handler nach der Orientierungsänderung wieder angebracht?

24

Schreiben Sie dies in Ihre Manifestdatei. In welcher Aktivität möchten Sie diese--

 Android:configChanges="orientation|keyboardHidden"

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

Android:configChanges="orientation|keyboardHidden|screenSize"

Auf jeden Fall wird es funktionieren .. 

9
Hulk

Versuche 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);
   ...
}
5
Hidayath

Es ist möglich, ein Attribut Android: configChanges mit dem Wert "Orientation" zu deklarieren. Dadurch wird verhindert, dass die Aktivität erneut gestartet wird. Stattdessen bleibt die Aktivität aktiv und die onConfigurationChanged () -Methode wird aufgerufen.

3
Nadav Daniel

Deklarieren Sie < Android:configChanges="orientation|keyboardHidden"/> in Ihrem Manifest. Auf diese Weise können Sie die Änderung der Orientierungs-/Tastatursichtbarkeit selbst vornehmen. Natürlich müssen Sie die Callback-Methode nicht überschreiben, um sie zu verwalten.

1

Hallo, ich bin auch auf dieses Problem gestoßen. was für mich feststand war:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putString("Username", mUsername);
    savedInstanceState.putString("Password", mPassword);
    savedInstanceState.putString("UserID", mUserID);

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

und dann in onCreate ():

if (savedInstanceState == null) {
    Bundle extras = getIntent().getExtras();
    if(extras == null) {
        mUsername = "?";
        mPassword = "?";
        mUserID = "?";
    } else {
        mUsername = extras.getString("Username");
        mPassword = extras.getString("Password");
        mUserID = extras.getString("UserID");
    }
} else {
    mUsername = (String) savedInstanceState.getSerializable("Username");
    mPassword = (String) savedInstanceState.getSerializable("Password");
    mUserID = (String) savedInstanceState.getSerializable("UserID");
}

dann können Sie sicher sein, dass die Objekte nicht null sind.

0
Noyloy