【发布时间】:2020-09-30 08:27:26
【问题描述】:
我在我的应用中添加了一个测验活动。我使用整数数组selected_options 来存储用户选择的选项。测验向用户显示每次尝试 5 个问题并将其存储在数组中,然后我添加了一个解决方案活动,如果答案错误,则用户选择的选项中显示为红色,否则显示为绿色。我直接从数据库中调用答案并相应地突出显示绿色,我没有问题。
但是我在突出显示用户选择的错误选项时遇到了一个问题,因为 selected_options 数组没有按我想要的那样工作。此外,当我到达解决方案 Activity 中的 ScrollView 底部并且活动崩溃时,我会收到 java.lang.ArrayIndexOutOfBoundsException: length=4; index=4 错误。
这是我声明变量selected_options的方式:
public static final ArrayList<questionObject> selected_questions = new ArrayList<>();
public static int[] selected_options;
public ArrayList<questionObject> result;
public ArrayList<questionObject> seen_questions;
TextView question, option1_text, option2_text, option3_text, option4_text, qCount;
ConstraintLayout[] options = new ConstraintLayout[4];
DatabaseReference databaseReference;
String currentUserID;
private Dialog loadingDialog;
private int quesNum;
private int score;
这是我在 onCreate() 函数中初始化它的方法:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStatusBarGradiant(this);
setContentView(R.layout.quiz_activity);
seen_questions = new ArrayList<>();
result = new ArrayList<>();
selected_options = new int[5];
question = findViewById(R.id.question_text);
qCount = findViewById(R.id.quest_num);
这就是我在onClick() 方法中添加选定选项的方式:
public void onClick(View view) {
int selectedOption = 0;
switch (view.getId()) {
case R.id.option_1_tile:
selectedOption = 1;
break;
case R.id.option_2_tile:
selectedOption = 2;
break;
case R.id.option_3_tile:
selectedOption = 3;
break;
case R.id.option_4_tile:
selectedOption = 4;
break;
default:
}
selected_options[quesNum] = selectedOption;
checkAnswer(selectedOption, view);
}
这就是我尝试在quizAdater 中使用它的方式:
class questionAdapter extends BaseAdapter {
TextView question, option1_text, option2_text, option3_text, option4_text, explanation, source;
ConstraintLayout[] options = new ConstraintLayout[4];
private Context context;
private ArrayList<questionObject> questions = quizActivity.selected_questions;
private int[] optionsSelected = quizActivity.selected_options;
public questionAdapter(Context context, ArrayList<questionObject> arrayList) {
this.context = context;
this.questions = arrayList;
}
@Override
public int getCount() {
return questions.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = LayoutInflater.from(context).inflate(R.layout.quiz_solutions_row, parent, false);
question = convertView.findViewById(R.id.question_text);
option1_text = convertView.findViewById(R.id.option_1_text);
option2_text = convertView.findViewById(R.id.option_2_text);
option3_text = convertView.findViewById(R.id.option_3_text);
option4_text = convertView.findViewById(R.id.option_4_text);
explanation = convertView.findViewById(R.id.explanation);
source = convertView.findViewById(R.id.source_button);
options[0] = convertView.findViewById(R.id.option_1_tile);
options[1] = convertView.findViewById(R.id.option_2_tile);
options[2] = convertView.findViewById(R.id.option_3_tile);
options[3] = convertView.findViewById(R.id.option_4_tile);
question.setText(questions.get(position).getQuestion());
option1_text.setText(questions.get(position).getOption1());
option2_text.setText(questions.get(position).getOption2());
option3_text.setText(questions.get(position).getOption3());
option4_text.setText(questions.get(position).getOption4());
explanation.setText("Explanation: " + questions.get(position).getExplanation());
source.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(context, urlActivity.class);
i.putExtra("url", questions.get(position).getSource());
i.putExtra("name", "Information Source");
context.startActivity(i);
}
});
if (optionsSelected[position] != questions.get(position).getAnswer()) {
options[position].setBackgroundTintList(ColorStateList.valueOf(Color.RED));
}
switch (questions.get(position).getAnswer()) {
case 1:
options[0].setBackgroundTintList(ColorStateList.valueOf(Color.GREEN));
break;
case 2:
options[1].setBackgroundTintList(ColorStateList.valueOf(Color.GREEN));
break;
case 3:
options[2].setBackgroundTintList(ColorStateList.valueOf(Color.GREEN));
break;
case 4:
options[3].setBackgroundTintList(ColorStateList.valueOf(Color.GREEN));
break;
}
return convertView;
}
}
这是用户请求的虚拟代码:
-
在 quizActivity 类中声明整数数组变量
selected_options -
将
onCreate()方法中的整数数组初始化为selected_options = new int[5]; -
添加用户选择的选项(向用户显示5个问题,每个问题有4个选项)为1-用于选项A,2-用于选项2等等
-
在
quizAdapter类中,初始化一个整数数组optionsSelected,并使用private int[] optionsSelected = quizActivity.selected_options;将来自quizActivity类的变量数组selected_options的值存储在其中 -
如果用户选择了错误的选项,则在解决方案 Activity using 中以红色显示他选择的选项
if (optionsSelected[position] != questions.get(position).getAnswer()) {
options[position].setBackgroundTintList(ColorStateList.valueOf(Color.RED)); }
我检查了日志,变量 quesNum 正确地从 0 变为 4,selected_options 数组也按预期工作,所以我无法调试可能导致问题的原因
【问题讨论】:
-
selected_options = new int[4]; -
实现的其余部分是否适合我的用例?为什么
int[4]? -
我每次尝试有 5 个问题,所以不应该是
[5]吗?这样做会使最后一个问题本身的测验崩溃 -
doing that crashes the quiz on the last question itself哪一行?你调试了吗? -
java.lang.ArrayIndexOutOfBoundsException: length=4; index=4 at inspire2connect.inspire2connect.quiz.quizActivity.onClick(quizActivity.java:345)在我上面给出的onClick()方法中的selected_options[quesNum] = selectedOption;行
标签: android arrays static indexoutofboundsexception