onSaveInstanceState(Bundle)方法

本文介绍了一个QuizActivity在设备旋转后导致题目序号重置的问题及解决方案。通过在onCreate方法中检查savedInstanceState来恢复旋转前的状态,确保了应用在设备旋转后能继续上次的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设备旋转后,当前的QuizActivity实例会被系统销毁,创建一个新的QuizActivity实例。而每次创建新的QuizActivity实例时,mCurrectIndex初始化为0,所以才会回到第一题上。
解决方法:在onCreate(Bundle savedInstanceState)方法中传入的参数就是保存的数据,要保存数据时覆盖public void onSaveInstanceState(Bundle savedInstanceState)
方法即可,该方法在onPause(),onStop(),onDestroy()方法之前由系统调用。

package com.onevol.app;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.example.geoquiz.R;

public class QuizActivity extends Activity {

    private static final String KEY_INDEX = "index";
    //新建一个常量作为Bundle的键,将mCurrectIndex变量作为Bundle的值。

    private Button mTureButton;

    private Button mFalseButton;
    private Button mPrevButton;
    private Button mNextButton;
    private TextView mQuestionTextView;
    private TrueFalse[] mQuestionBank = new TrueFalse[] {
            new TrueFalse(R.string.question_africa, false),
            new TrueFalse(R.string.question_americas, true),
            new TrueFalse(R.string.question_asia, true),
            new TrueFalse(R.string.question_mideast, false),
            new TrueFalse(R.string.question_oceans, true),
    };
    private int mCurrectIndex = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_quiz);

        mTureButton = (Button) findViewById(R.id.ture_button);
        mFalseButton = (Button) findViewById(R.id.false_button);
        mPrevButton = (Button) findViewById(R.id.prev_button);
        mNextButton = (Button) findViewById(R.id.next_button);

        mQuestionTextView = (TextView) findViewById(R.id.question_text);

        if(savedInstanceState != null){//在onCreate()方法中检查储存的Bundle信息。在UpdateQuestion()方法前检查。
            mCurrectIndex = savedInstanceState.getInt(KEY_INDEX);
        }
        updateQuestion();

        mTureButton.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
//              Toast.makeText(QuizActivity.this, "Incorrect", Toast.LENGTH_SHORT).show();
                checkAnswer(true);
            }
        });

        mFalseButton.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
//              Toast.makeText(QuizActivity.this, "Correct", Toast.LENGTH_SHORT).show();
                checkAnswer(false);
            }
        });
        mPrevButton.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if(mCurrectIndex == 0){
                    int question = mQuestionBank[mQuestionBank.length -1].getQuestion();
                    mQuestionTextView.setText(question);
                    mCurrectIndex = 4;
                } else{
                    mCurrectIndex = (mCurrectIndex -1);
                    updateQuestion();
                }
            }

        });
        mNextButton.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                mCurrectIndex = (mCurrectIndex + 1) % mQuestionBank.length;
                updateQuestion();
            }

        });
        mQuestionTextView.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                mCurrectIndex = (mCurrectIndex + 1) % mQuestionBank.length;
                updateQuestion();
            }

        });
    }
    private void updateQuestion() {
        int question = mQuestionBank[mCurrectIndex].getQuestion();
        mQuestionTextView.setText(question);
    }

    private void checkAnswer (boolean userPressedTrue){
        boolean answerIsTrue = mQuestionBank[mCurrectIndex].isTrueQuestion();
        if(userPressedTrue == answerIsTrue){
            Toast.makeText(this, "Correct", Toast.LENGTH_SHORT).show();
        } else{
            Toast.makeText(this, "Incorrect", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // TODO Auto-generated method stub
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    protected void onSaveInstanceState(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onSaveInstanceState(savedInstanceState);
        savedInstanceState.putInt(KEY_INDEX, mCurrectIndex);
        //将mCurrectIndex储存到Bundle中。
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值