Android-przełączanie między trybem poziomym i pionowym powoduje utratę wartości intencji

Używam Intentów, aby przełączać się między aktywnościami w mojej aplikacji na Androida. Umieszczam dane w celu wykorzystania w następnym działaniu. Kiedy przełączam Telefon między trybami poziomym i pionowym, wartości przekazane z intencji są tracone i otrzymuję wyjątek NullPointerException.

Czy ktoś może mi powiedzieć, co może być nie tak?

Jest dużo kodu, aby go w całości opublikować. Ale jeśli ktoś musi przyjrzeć się konkretnym fragmentom kodu, mogę go zamieścić proszę.

Edit
Rozwiązałem problem nie ocalenia Państwa. Ale innym problemem, z jakim się spotkałem, jest to, że żaden z przycisków na ekranie nie działa po zmianie orientacji. Po naciśnięciu przycisku dostaję to Ostrzeżenie W LogCat

02-25 23:07:49.190: WARN/WindowManager(58): No window to dispatch pointer action 0
Proszę o pomoc.
Author: lostInTransit, 2009-02-25

6 answers

Po zmianie orientacji aktywność jest odtwarzana, a onCreate jest przywoływane, więc musisz użyć pakietu, aby zapisać swój aktualny stan i przywrócić po zmianie orientacji. Możesz to zobaczyć w akcji, jeśli masz tylko aplikację z widokiem tekstowym i wprowadzasz tekst i zmieniasz orientację. / Align = "center" bgcolor = "# e0ffe0 " / cesarz chin / / align = center / Prawdopodobnie dlatego masz NullPointer po zmianie orientacji. To jest irytujące jak diabli ale coś musimy żyć z.

Ten link do serii samouczków orientacyjnych i ten pierwszy w szczególności powinien pomóc ci dokładnie zrozumieć, co się dzieje i jak skutecznie utrzymać obecny stan.

Update: jest też post NA so Activity restart on rotation Android , który dotyczy prawie tego samego.

Edit for follow up question:

Czy po zmianie orientacji ponownie załączyłeś programy obsługi kliknięć?

 25
Author: Quintin Robinson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:45:36

Napisz to w swoim manifeście file..in które działanie chcesz to --

 android:configChanges="orientation|keyboardHidden"

Edited: Użyj tego dla nowych wersji API--

android:configChanges="orientation|keyboardHidden|screenSize"
Zdecydowanie zadziała..
 9
Author: Hulk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-11 05:20:44

Spróbuj tego:

@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
Author: Amanda S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-12 23:32:37

Można zadeklarować atrybut android: configChanges o wartości "orientation", zapobiegnie to ponownemu uruchomieniu aktywności. Zamiast tego aktywność pozostaje uruchomiona i wywołana jest jej metoda onConfigurationChanged ().

 3
Author: Nadav Daniel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-20 14:21:17

Zadeklaruj < android:configChanges="orientation|keyboardHidden"/> w manifeście. Umożliwia to samodzielne zarządzanie zmianą orientacji / widoczności klawiatury. Oczywiście nie musisz nadpisywać metody wywołania zwrotnego, aby nią zarządzać.

 1
Author: Nguyen Minh Binh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-22 06:03:03

Witam również napotkałem ten problem. to co dla mnie poprawiło to:

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

A następnie w 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");
}

Wtedy możesz być pewien, że obiekty nie są null.

 0
Author: Noyloy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-29 17:24:02