2016-08-15 137 views
0

的时候所以我已经实现了一个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); 
} 
} 
+0

什么是qid'的'的价值,当你在这里使用它:'currentQ = mQuestionList.get(QID);'? –

+0

最初值为0 – Sai

+0

只是这行之前添加一个'Log.d()'声明。这条线每执行一次**你就会看到'qid'是'0' **。 –

回答

1

你需要加载使用mQuestionList.get(qid)问题之前恢复qid,否则问题将永远是为qid尚未恢复的第一个。

把它设置的内容视图,例如(内onCreate)后直接:

setContentView(/*...*/); 
if (savedInstanceState != null){ 
    qid = savedInstanceState.getInt(KEY_INDEX,0); 
} 
// Now load your question with the qid 
currentQ = mQuestionList.get(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 
} 
+0

我曾尝试过。它稍微好一些,但仍然很奇怪。所以当我旋转屏幕时,它仍会重置为问题1,但它不会跳过整个问题。再次如果我在问题6并且旋转屏幕,它会向我展示问题1,当我回答问题时问题7。这是否与我如何更新我的UI有关? – Sai

+0

你的意思是把该代码放在“setQuestionView();”之前对?或者我应该把它放在代码行之前 - mQuestionList = db.getAllQuestions(); //这将获取所有问题currentQ = mQuestionList.get(qid); //当前的问题 – Sai

+0

不,它应该在调用'mQuestionList.get(qid)'之前。您在此处使用'qid'而未正确恢复问题编号。 – TR4Android

0

的问题是,你从保存的Bundle检索其值之前使用qid。有很多方法可以解决这个问题。一个解决办法是把这个行:

currentQ = mQuestionList.get(qid); 

setQuestionView()顶部:

private void setQuestionView() { 
    currentQ = mQuestionList.get(qid); 
    //... 
} 

我强烈建议你学习如何使用调试器中的Android Studio或以跟踪执行使用Log.d()的代码。这些工具将帮助您追踪这样的问题。

+0

当我将代码更改为该代码时,它跳过了一个问题。如果我在问题2中,并且我旋转了屏幕,它会转到问题3,但实际上我没有选择答案。我将在开发者页面上查找调试器的东西。 – Sai

+0

@Sai你可能在用户回答问题之前改变'qid'。发现这种情况的唯一方法是使用一些调试技术。祝你好运! –