BordoBereli
BordoBereli

Reputation: 43

When Orientation change,onSaveInstanceState call caused values Swap

I have two variables to save on device orientation. One is current question number as an integer, another is a boolean value if the user cheated. It working fine when I'm storing and retrieving sinle value while storing both value it swaps.

public class QuizActivity extends ActionBarActivity {

    // Logging members
    private static final String LOG_TAG = QuizActivity.class.getSimpleName();

    // The member of Saving the state for rotation of the device
    private static final String KEY_BOOLEAN = "index";
    private static final String KEY_INT = "index";

    // Adding members
    private Button mTrueButton;
    private Button mFalseButton;
    private Button mNextButton;
    private Button mBackButton;
    private TextView mQuestionTextView;
    private ImageButton mImgRightButton;
    private ImageButton mImgLeftButton;
    private Button mCheatButton;

    private TrueFalse[] mQuestionBank = new TrueFalse[] {
            new TrueFalse(R.string.question_oceans, true),
            new TrueFalse(R.string.question_mideast, false),
            new TrueFalse(R.string.question_africa, false),
            new TrueFalse(R.string.question_americas, true),
            new TrueFalse(R.string.question_asia, true)
    };

    private int mCurrentIndex = 0;

    // To save the CheatActivity returning result
    private boolean mIsCheater;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(LOG_TAG, "QuizActivity onCreate(Bundle) called");
        setContentView(R.layout.activity_quiz);

        if(savedInstanceState != null) {
            mCurrentIndex = savedInstanceState.getInt(KEY_INT);
            mIsCheater = savedInstanceState.getBoolean(KEY_BOOLEAN);
        }
    }

    // Not to loose activity state when rotating the device
    @Override
    public void onSaveInstanceState(Bundle saveInstanceState) {
        Log.i(LOG_TAG, "onSaveIntanceState");

        saveInstanceState.putInt(KEY_INT, mCurrentIndex);
        saveInstanceState.putBoolean(KEY_BOOLEAN, mIsCheater);

        super.onSaveInstanceState(saveInstanceState);
    };

    // to get the result from child activity(Cheat activity)
    @Override
    protected void onActivityResult(int arg0, int arg1, Intent data) {
        if(data == null){
            return;
        }
        mIsCheater = data.getBooleanExtra(CheatActivity.EXTRA_ANSWER_SHOWN, false);
    };

}

Upvotes: 0

Views: 59

Answers (2)

sberezin
sberezin

Reputation: 3296

You have the same keys!! Change code like this:

private static final String KEY_BOOLEAN = "index_BOOLEAN";
private static final String KEY_INT = "index_INT";

Upvotes: 1

brummfondel
brummfondel

Reputation: 1210

KEY_INT and KEY_BOOLEAN have the same name, the same value. So when setting those in the bundle one might overwrite the other. Use different names:

private static final String KEY_INT="intindex";
private static final String KEY_BOOLEAN="boolindex";

Upvotes: 1

Related Questions