我正在通过The big nerd ranch的Android编程第3版本书自己工作。在第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)
答案 0 :(得分:2)
问题是(-1 % n)
对于Java中的任何-1
都是n
。为了确保您回绕到数组的末尾,您可以使用:
mCurrentIndex = (mCurrentIndex + mQuestionBank.length - 1) % mQuestionBank.length;
如果mCurrentIndex
已经在范围内,那将导致mCurrentIndex
始终在范围内。
如果你不想回头(并且我建议对称地对待"以前""下一个"按钮),那么你可以做一个或两者兼而有之:
mCurrentIndex
处于极值SELECT *
FROM Tweet
WHERE text = ANY (SELECT max(length(text)), min(length(text)), avg(length(text))
FROM Tweet
)
处于极值,则禁用相关按钮,因此无法触发事件处理程序。