目标:用户答完某道题,就禁掉那道题对应的按钮,防止用户一题多答。
在此之前,创建一个Question类的时候,已经有了两个属性。
private int mTextResId;
private boolean mAnswerTrue;
第一个是这个Question类的文本资源Id
第二个是这个Question类的一种状态答案是否正确
我的目标中需要答完某道题,禁掉这道题对应的按钮,那么Question类中应该有这样一个状态,这个状态描述用户是否作答。因此,在Question类中创造它。(注意boolean的默认值为false)
//是否已经回答
private boolean mAnswered;
//get方法
public boolean isAnswered() {
return mAnswered;
}
//set方法
public void setAnswered(boolean answered) {
mAnswered = answered;
}
我还要保证这种状态数据在活动被删除之前被保留下来,因为当此活动旋转的时候,有一个删除活动重新创建活动的过程。
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
//存储是否作答状态
boolean answerIsAnswered[] = new boolean[mQuestionBank.length];
for (int i = 0; i < mQuestionBank.length; i++) {
answerIsAnswered[i] = mQuestionBank[i].isAnswered();
}
outState.putBooleanArray(KEY_ANSWERED, answerIsAnswered);
}
private static final String KEY_ANSWERED = "KEY_ANSWERED";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
boolean answerIsAnswered[] = savedInstanceState.getBooleanArray(KEY_ANSWERED);
for (int i = 0; i < mQuestionBank.length; i++) {
mQuestionBank[i].setAnswered(answerIsAnswered[i]);
}
}
想象一下视图,点击一个true或false按钮,无论对错与否再也不能点击这两个按钮,以前代码显示,当点击这两个按钮的时候,都调用checkAnswer()方法,在这个方法里面调用checkIfAnswered()方法,可以保证点击这两个按钮任意一个按钮的时候,都不能再在这个问题中点击这两个按钮。(当然,因为点击了按钮,已经回答了,所以在调用checkIfAnswered()方法之前应修改问题的作答状态为true)
想象一下视图,点击next按钮,进入下一个问题,这时需要让按钮可以使用,则必须在此按钮点击事件中调用checkIfAnswered()方法。
想到这里,我需要做三件事。
1、在此活动中写一个checkIfAnswered()方法,判断是否作答。
//检查是否作答
private void checkIfAnswered() {
boolean answerIsAnswered = mQuestionBank[mCurrentIndex].isAnswered();
if (answerIsAnswered == true) {
mTrueButton.setEnabled(false);
mFalseButton.setEnabled(false);
} else {
mTrueButton.setEnabled(true);
mFalseButton.setEnabled(true);
}
}
2、在checkAnswer()方法中调用checkIfAnswered()方法。(当然,因为点击了按钮,已经回答了,所以在调用checkIfAnswered()方法之前应修改问题的作答状态为true)
private void checkAnswer(boolean userPressedTrue) {
mQuestionBank[mCurrentIndex].setAnswered(true);
checkIfAnswered();
}
3、在next按钮点击事件中调用checkIfAnswered()方法。
mNextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
checkIfAnswered();
}
});
注:自学专用,有问题欢迎一起探讨