2017-06-07 73 views
0

我正在通过大书呆子牧场Android编程第三版书自己工作。在第2章中,向应用添加上一个按钮是一个挑战。我已经添加了前一个按钮,只要我不尝试先前的第一个问题,它就可以正常工作。我不知道如何循环按钮,所以无论何时我在第一个问题前,它都默认为最后一个问题。下一个按钮会循环所有问题,但是前一个按钮不会。我只是学习Android环境,所以我确定这是一个简单的问题。我该如何解决我目前的错误?固定阵列超出索引错误

mNextButton = (Button) findViewById(R.id.next_button); 
    mNextButton.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v) { 
      mCurrentIndex = (mCurrentIndex + 1) % mQuestionBank.length; 
      updateQuestion(); 

      } 
     }); 


    mPreviousButton = (Button) findViewById(R.id.previous_button); 
    mPreviousButton.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v) { 
      mCurrentIndex = (mCurrentIndex - 1) % mQuestionBank.length; 
      updatePrevQuestion(); 

     } 
    }); 

    updateQuestion(); 
    updatePrevQuestion(); 

} 

private void updatePrevQuestion(){ 
    int question = mQuestionBank[mCurrentIndex].getTextResId(); 
    mQuestionTexView.setText(question); 
} 

private void updateQuestion(){ 
    int question = mQuestionBank[mCurrentIndex].getTextResId(); 
    mQuestionTexView.setText(question); 
} 

以下是错误即时得到

6-06 19:18:09.158 14727-14727/com.example.dany_user.geo_quiz E/AndroidRuntime: FATAL EXCEPTION: main 

Process: com.example.dany_user.geo_quiz, PID: 14727 

java.lang.ArrayIndexOutOfBoundsException: length=6; index=-1 

at com.example.dany_user.geo_quiz.QuizActivity.updatePrevQuestion(QuizActivity.java:98) 
                       at com.example.dany_user.geo_quiz.QuizActivity.access$400(QuizActivity.java:11) 
                       at com.example.dany_user.geo_quiz.QuizActivity$5.onClick(QuizActivity.java:87) 
                       at android.view.View.performClick(View.java:6205) 
                       at android.widget.TextView.performClick(TextView.java:11103) 
                       at android.view.View$PerformClick.run(View.java:23653) 
                       at android.os.Handler.handleCallback(Handler.java:751) 
                       at android.os.Handler.dispatchMessage(Handler.java:95) 
                       at android.os.Looper.loop(Looper.java:154) 
                       at android.app.ActivityThread.main(ActivityThread.java:6682) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410) 

回答

2

的问题是,(-1 % n)-1在Java任何n。为了确保您环绕到数组的结尾,您可以使用此:

mCurrentIndex = (mCurrentIndex + mQuestionBank.length - 1) % mQuestionBank.length; 

这将导致mCurrentIndex总是在范围内的评估之后,如果它已经在范围内。

如果您不想环绕(我会建议治疗对称“上一页”和“下一页”按钮),那么你可以做以下的一种或两种:

  • 待办事项如果mCurrentIndex处于极端值,则事件处理程序中没有任何事件
  • 如果mCurrentIndex处于极端值,则禁用相关按钮,因此无法触发事件处理程序。