java - 旋转屏幕时丢失数据

标签 java android

所以我实现了一个 saveInstanceState 方法,但我不知道我是否做错了。

发生的情况是,当屏幕旋转时,显示的问题成为列表中的第一个问题。但奇怪的是,当问题得到解答时,应用程序会跳过一个问题并转到下一个问题。

例如,我正在回答问题 6。屏幕旋转后,它会再次转到问题 1,但如果我要回答问题 1,出现的下一个问题是问题 8。每次屏幕旋转都算作一个问题。我很困惑。

List<Question> mQuestionList;
int score = 0;
int qid = 0;
Question currentQ;
TextView txtQuestion, times, scored;
Button button1, button2, button3, button4;
private static final String TAG = "NoTimerQuestion";
private static final String KEY_INDEX = "index";
private static final String KEY_SCORE = "scoreindex";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);



    DbHelper db = new DbHelper(this); // my question bank class
    mQuestionList = db.getAllQuestions(); // this will fetch all questions
    currentQ = mQuestionList.get(qid); // the current question
    txtQuestion = (TextView) findViewById(R.id.txtQuestion);
    times = (TextView) findViewById(R.id.timers);
    times.setText("");

    button1 = (Button) findViewById(R.id.button1);
    button2 = (Button) findViewById(R.id.button2);
    button3 = (Button) findViewById(R.id.button3);
    button4 = (Button) findViewById(R.id.button4);
    scored = (TextView) findViewById(R.id.score);

    if(savedInstanceState != null){
        qid = savedInstanceState.getInt(KEY_INDEX,0);
        score = savedInstanceState.getInt(KEY_SCORE,0);
    }

    setQuestionView();

    button1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            getAnswer(button1.getText().toString());
        }
    });
    button2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            getAnswer(button2.getText().toString());
        }
    });
    button3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            getAnswer(button3.getText().toString());
        }
    });
    button4.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            getAnswer(button4.getText().toString());
        }
    });
}
public void getAnswer(String AnswerString) {
    if (currentQ.getANSWER().equals(AnswerString)) {
        score++;
        scored.setText("Score : " + score);
    } 
    if (++qid < 20) {
        currentQ = mQuestionList.get(qid);
        setQuestionView();
    } else {
        Intent intent = new Intent(NoTimerQuestion.this,
                ResultsActivity.class);
        Bundle b = new Bundle();
        b.putInt("score", score); // Your score
        intent.putExtras(b); // Put your score to your next
        startActivity(intent);
        finish();
    }
}

private void setQuestionView() {
    txtQuestion.setText(currentQ.getQUESTION());
    button1.setText(currentQ.getOPTA());
    button2.setText(currentQ.getOPTB());
    button3.setText(currentQ.getOPTC());
    button4.setText(currentQ.getOPTD());
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState){
    super.onSaveInstanceState(savedInstanceState);
    Log.i(TAG, "onSaveInstanceState");
    savedInstanceState.putInt(KEY_INDEX, qid);
    savedInstanceState.putInt(KEY_SCORE, score);
}
}

最佳答案

在使用mQuestionList.get(qid)加载问题之前,您需要恢复qid,否则问题将始终是第一个qid 尚未恢复。

直接在设置内容 View 后放置,例如(在onCreate内):

setContentView(/*...*/);
if (savedInstanceState != null){
    qid = savedInstanceState.getInt(KEY_INDEX,0);
}
// Now load your question with the qid
currentQ = mQuestionList.get(qid);

此外,为了获得正确的 qid,您需要在恢复 qid 时减去 1,或者仅在恢复 qid 时增加它。实际上正在加载一个新问题:

public void getAnswer(String AnswerString) {
    // ...
    if (++qid < 20) { // - add increment here
        currentQ = mQuestionList.get(qid);
        setQuestionView();
    } else {
        // ...
    }
}

private void setQuestionView() {
    // ...
    // qid++; - remove increment here
}

关于java - 旋转屏幕时丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38963689/

相关文章:

android - 使用带有 ActionBarSherlock 和 Roboguice 的 maven android 构建失败

java - 将 JHipster 应用程序上传到 Nexus Repository 3 不起作用

java - 如何在 Java Applet 中保存一些配置信息?

java - 克隆一个 Properties 对象

java - 插入数据时出现无效数据库路径错误

php - 字符串编码/解码(PHP-Android)

android - 在 startIntentSenderForResult() 之后未调用 onActivityResult()

java - OpenCSV 避免使用 FileWriter 并返回 InputStream

java - 使用 JNLP 启动具有 Java3D 依赖项的小程序时出现问题

Android 首选项 - 来自数据库的 ListPreference 不起作用