@privetuly

Почему savedInstanceState всегда возвращает null?

Есть три активити. Обозначим их "A, B, C".

Из "A" отправляется в "B" параметр в виде Int (число попыток).
public void onAnimationEnd(Animation animation) {
                Intent intent = new Intent(activity, GameActivity.class);
                intent.putExtra(Constans.GUESSES_AMOUNT, guessPicker.getValue());

                startActivity(intent);
            }


В активити "B" этот параметр берется из "A" в случае если savedInstanceState == null, иначе берется значение из savedInstanceState.

if(savedInstanceState == null) {
            if(getIntent().getExtras() != null) {
                guessAmount = getIntent().getExtras().getInt(Constans.GUESSES_AMOUNT);
            }
        } else {
            guessAmount = savedInstanceState.getInt(Constans.GUESSES_AMOUNT);
        }


Сохранение происходит вот так:
@Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putInt(Constans.GUESSES_AMOUNT, guessAmount);
        super.onSaveInstanceState(outState);
    }


Соответственно из "B" мы можем перейти в "C".
Мне нужно чтобы параметр, который хранится в "B" (guessAmount) инициализировался исходя из того что пришло из "A" и при этом, чтобы значение сохраняло свое состояние при переходе из "B" в "C".

Далее в "C" происходят какие-то действия и идет переход обратно в "B".
private void startGameActivity(boolean guessResult, boolean isGuesses) {
        Intent gameIntent = new Intent(activity, GameActivity.class);
        putCurrentFlags(gameIntent, guessResult, isGuesses);
        startActivity(gameIntent);
    }


Проблема в том что код
guessAmount = savedInstanceState.getInt(Constans.GUESSES_AMOUNT);


Никогда не вызывается по причине того что savedInstanceState == null.

Что пробовал сделать:
1) Добавлял в Android manifest для активити "B" singleTop.
<activity android:name="com.guessplace.fragments.GameActivity"
            android:launchMode="singleTop"/>


2) Идентификаторы создал для layout. Вот он:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/game_activity"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.guessplace.fragments.GameActivity">

    <fragment
        android:id="@+id/street_panorama"
        android:name="com.google.android.gms.maps.StreetViewPanoramaFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <Button
        android:id="@+id/make_guess"
        android:layout_width="120dp"
        android:layout_height="40dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="67dp"
        android:background="@drawable/btn_backg"
        android:fontFamily="sans-serif-smallcaps"
        android:onClick="makeGuess"
        android:text="@string/make_guess" />


</RelativeLayout>


3) Пробовал вызывать outState.putInt(Constans.GUESSES_AMOUNT, guessAmount); до и после super.onSaveInstanceState(outState);

Небольшое замечание. A, B, C наследуются от Activity.
  • Вопрос задан
  • 210 просмотров
Пригласить эксперта
Ответы на вопрос 2
@red-barbarian
как то все запутано.
savedInstanceState Bundle: If the activity is being re-initialized after previously being shut down then this Bundle contains the data it most recently supplied in onSaveInstanceState(Bundle). Note: Otherwise it is null.

при пересоздании не будет нул.
Для Вашего случая, может отделить логику от презентации?
Например количество попыток это скорее понятие существующее на уровне всей игры, а не на уровне (и времени жизни) активити. Поэтому и привязывать его к жизни приложения (Application).
Думаю проще будет, чем гонять данные из первой активити в третью
Ответ написан
Комментировать
orcDamnar
@orcDamnar
Java, C/C++, Android SDK
singleTop - подразумевает, что при переходе из C в B:
private void startGameActivity(boolean guessResult, boolean isGuesses) {
        Intent gameIntent = new Intent(activity, GameActivity.class);
        putCurrentFlags(gameIntent, guessResult, isGuesses);
        startActivity(gameIntent);
 }


ловить возврат нужно в onNewIntent. то есть не получиться просто в onSaveInstance сохранить данный параметр. Вообще, если C всегда child по отношению к B то лучше или стартовать onActivityResult или возвращаться через finish() или Navigation.Up. или вообще сделать C - диалогом от B
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы