Frage

Ich bin Intents mit zwischen den Aktivitäten in meinem Android-App zu wechseln. Ich setze Daten in dem Intent zur Verwendung in der nächsten Aktivität. Wenn ich das Telefon zwischen Quer- und Hochformat zu wechseln, die von der Absicht übergebenen Werte verloren und ich einen Nullpointer bekommen.

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

Es gibt eine Menge von Code, um es vollständig zu veröffentlichen. Aber wenn jemand auf bestimmte Teile des Codes zu suchen braucht, kann ich es hier posten.

Bearbeiten
Ich löste das Problem des Staates nicht gespeichert werden. Aber ein anderes Problem, das ich konfrontiert ist, dass keine der Tasten auf dem Bildschirm Arbeit nach der Ausrichtung geändert wurde. Auf Taste drücken, bekomme ich diese Warnung in LogCat

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

Bitte helfen.

War es hilfreich?

Lösung

Wenn Sie Ausrichtung wechseln wird die Aktivität neu erstellt und onCreate abgerufen wird, so dass Sie das Bündel verwenden, haben Sie Ihren aktuellen Zustand und Wiederherstellung nach einer Orientierungsänderung zu speichern. Sie können dies in Aktion sehen, wenn Sie nur eine App mit einem Textview und Sie Text eingeben und die Ausrichtung ändern. Wenn Sie Ihren Status für onCreate bündeln können Sie diese einzudämmen. Dies ist wahrscheinlich auch, warum Sie eine Nullpointer nach den Orientierungsänderungen haben. Es ist ärgerlich, wie die Hölle, aber etwas, das wir haben, damit zu leben.

Dieser Link auf eine Reihe von Orientierungstutorien und diese erste insbesondere sollten Ihnen helfen, genau zu verstehen, was los ist und wie erfolgreich Ihren aktuellen Stand zu halten.

Update: Es gibt auch einen Beitrag auf SO Aktivität Neustart bei Rotation Android dass beschäftigt sich mit fast die gleiche Sache.

Bearbeiten für eine Nachuntersuchung Frage:

Haben Sie wieder anbringen Ihren Click-Handler nach der Orientierung ändern?

Andere Tipps

Schreiben Sie diese in Ihrem Manifest file..in, welche Aktivität Sie dies wünschen -

 android:configChanges="orientation|keyboardHidden"

Editiert: Verwenden Sie diese für neue APIs Versionen -

android:configChanges="orientation|keyboardHidden|screenSize"

Auf jeden Fall wird es funktionieren ..

Versuchen Sie folgendes:

@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);
   ...
}

Es ist möglich, ein Attribut android zu deklarieren: configChanges mit dem Wert von „Orientierung“, das die Aktivität verhindern wird von neu gestartet werden. Stattdessen wird die Aktivität bleibt läuft und seine onConfigurationChanged () -Methode aufgerufen.

Deklarieren < android:configChanges="orientation|keyboardHidden"/> in Ihrem Manifest. Auf diese Weise können Sie die Änderung der Orientierung / Keyboard Sichtbarkeit selbst verwalten. Natürlich müssen Sie nicht die Callback-Methode außer Kraft zu setzen für sie verwalten.

Hallo Ich traf auch dieses Problem. was es für mich gerichtet 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, die Objekte sind nicht null.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top