2016-08-15 140 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'。發現這種情況的唯一方法是使用一些調試技術。祝你好運! –