前情概要
初学,按照课本案例建立一个简单项目,一个问题,有true和false两个作答按钮,回答后会反馈正确与否
实验内容
- 除了课堂上介绍的设置的监听器的方法,还有哪些办法实现按钮的响应?
- 增加两个按钮(prev,next)实现问题的遍历。
- 问题描述已经分离在资源文件中,如何将answer也分离在资源文件中?
- 如果要增加新的问题及其答案,是否需要修改Java代码?能否不修改Java代码,仅修改资源文件就实现增加新的问题。提示:Array类型的资源.
- 用户答完某题后,禁掉对应题目的True和False作答按钮,即,一个题目只允许作答一次;
- 用户答完全部的题目后,toast消息提示答对题目的百分比评分;
作答
1.除了课堂上介绍的设置的监听器的方法,还有哪些办法实现按钮的响应?
方法一:指定按钮功能
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button1"
android:onClick="onClick"
android:text="Button1"/>
<Button>
方法二:自定义事件
增加onClick()方法,再在onCreate()里调用
public void onClick(View view) {
switch (view.getId()){
case R.id.button1:
tst=Toast.makeText(MainActivity.this,"button1",Toast.LENGTH_SHORT);
tst.show();
break;
case R.id.button2:
tst=Toast.makeText(MainActivity.this,"button2",Toast.LENGTH_SHORT);
tst.show();
break;
default:break;
}
- 增加两个按钮(prev,next)实现问题的遍历。
//设置next按钮
mNextButton = (Button) findViewById(R.id.next_button) ;
mNextButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
if(mCurrentIndex<mQuestionBank.length-1)
mCurrentIndex = (mCurrentIndex + 1) % mQuestionBank.length;
// int question = mQuestionBank[mCurrentIndex].getTextResId();
// mQuestionTextView.setText(question) ;
updateQuestion();
}
});
mPreButton = (Button) findViewById(R.id.pre_button) ;
mPreButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
if(mCurrentIndex>0)
mCurrentIndex = (mCurrentIndex - 1) % mQuestionBank.length;
updateQuestion();
}
});
- 问题描述已经分离在资源文件中,如何将answer也分离在资源文件中?
资源文件中:
<string name="true_answer">true</string>
<string name="false_answer">false</string>
模型层Question.java:
private int mTextResId; //问题文本对应id
private boolean mAnswerTrue; //答案
private int mAnswerId; //分离在资源文件中答案id
控制层:
private Question[] mQuestionBank = new Question[] {
/*new Question(R.string.question1, false) ,
new Question(R.string.question2,true) ,
new Question(R.string.question3, true),
new Question(R.string.question4,true)*/
new Question(R.string.question1, R.string.false_answer) ,
new Question(R.string.question2,R.string.true_answer) ,
new Question(R.string.question3, R.string.true_answer),
new Question(R.string.question4,R.string.true_answer)
};
//判断答案对错
private void checkAnswer(boolean userPressedTrue) {
// boolean answerIsTrue = mQuestionBank[mCurrentIndex].isAnswerTrue();
boolean answerIsTrue=Boolean.parseBoolean(getResources().getString(mQuestionBank[mCurrentIndex].getAnswerId()));
int messageResId = 0;
if (userPressedTrue == answerIsTrue)
messageResId = R.string.correct_toast;
else {
messageResId = R.string.incorrect_toast;
}
Toast.makeText(this, messageResId,Toast.LENGTH_SHORT).show( );
}
- 如果要增加新的问题及其答案,是否需要修改Java代码?能否不修改Java代码,仅修改资源文件就实现增加新的问题。提示:Array类型的资源.
array.xml:
<resources>
<string-array name="questions">
<item>你是机器人吗?</item>
<item>陌刀将军是李嗣业吗?</item>
<item>男生宿舍宿舍是6个人吗?</item>
<item>真的有人学计算机吗?</item>
</string-array>
<string-array name="answers">
<item>false</item>
<item>true</item>
<item>true</item>
<item>true</item>
</string-array>
</resources>
模型层Question.java:
//用于数组
private String questionString;
private String answerString;
public Question(String questionString, String answerString) {
this.questionString = questionString;
this.answerString = answerString;
}
控制层QuizActivity.java:
//初始化问题数组
Resources res=getResources();
String[] questions=res.getStringArray(R.array.questions);
String[] answers=res.getStringArray(R.array.answers);
int length=questions.length;
mQuestionBank=new Question[length];
for(int i=0;i<length;i++){
mQuestionBank[i]=new Question(questions[i],answers[i]);
}
- 用户答完某题后,禁掉对应题目的True和False作答按钮,即,一个题目只允许作答一次;
创建一个数组记录问题状态:
private int[] flag; //答题情况,0未答,1正确,2错误
按下作答按钮后触发:setEnabled(false)禁用 setEnabled(true)恢复许用
mTrueButton=(Button) findViewById(R.id.true_button);
mTrueButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
// Toast.makeText(QuizActivity.this,R.string.correct_toast,Toast.LENGTH_SHORT).show();
checkAnswer(true);
if (flag[mCurrentIndex]!=0){ //已答题
mTrueButton.setEnabled(false); //禁掉作答按钮
mFalseButton.setEnabled(false);
}
}
});
//判断答案对错
private void checkAnswer(boolean userPressedTrue) {
Boolean answerIsTrue=Boolean.parseBoolean(mQuestionBank[mCurrentIndex].getAnswerString());
int messageResId = 0;
if (userPressedTrue == answerIsTrue){
messageResId = R.string.correct_toast;
flag[mCurrentIndex]=1;
}
else {
messageResId = R.string.incorrect_toast;
flag[mCurrentIndex]=2;
}
Toast.makeText(this, messageResId,Toast.LENGTH_SHORT).show( );
}
- 用户答完全部的题目后,toast消息提示答对题目的百分比评分;
在判断对错checkAnswer函数里添加
if(mCurrentIndex==mQuestionBank.length-1){ //答题完毕
double trueNum=0;
for (int i=0;i<flag.length;i++){
if(flag[i]==1)
trueNum++;
// System.out.println(trueNum);
}
trueNum=trueNum/(mQuestionBank.length*1.0); //正确率
NumberFormat format = NumberFormat.getPercentInstance();
format.setMaximumFractionDigits(2);//设置保留几位小数
System.out.println("百分比为:"+format.format(trueNum));
Toast.makeText(this,"正确率:"+format.format(trueNum),Toast.LENGTH_SHORT).show();
}
全部源码
Question.java
public class Question {
private int mTextResId; //问题文本对应id
private boolean mAnswerTrue; //答案
private int mAnswerId; //分离在资源文件中答案id
//用于数组
private String questionString;
private String answerString;
public Question(String questionString, String answerString) {
this.questionString = questionString;
this.answerString = answerString;
}
public Question(int textResId, boolean answerTrue) {
mTextResId = textResId;
mAnswerTrue = answerTrue;
}
public Question(int textResId, int answerId) {
mTextResId = textResId;
mAnswerId = answerId;
}
public String getQuestionString() {
return questionString;
}
public void setQuestionString(String questionString) {
this.questionString = questionString;
}
public String getAnswerString() {
return answerString;
}
public void setAnswerString(String answerString) {
this.answerString = answerString;
}
public int getAnswerId() {
return mAnswerId;
}
public void setAnswerId(int answerId) {
mAnswerId = answerId;
}
public int getTextResId() {
return mTextResId;
}
public void setTextResId(int textResId) {
mTextResId = textResId;
}
public boolean isAnswerTrue() {
return mAnswerTrue;
}
public void setAnswerTrue(boolean answerTrue) {
mAnswerTrue = answerTrue;
}
}
QuizActivity.java
public class QuizActivity extends AppCompatActivity {
private Button mTrueButton;
private Button mFalseButton;
private Button mNextButton;
private Button mPreButton;
private TextView mQuestionTextView;
/* private Question[] mQuestionBank = new Question[] {
//问题放在资源文件
*//*new Question(R.string.question1, false) ,
new Question(R.string.question2,true) ,
new Question(R.string.question3, true),
new Question(R.string.question4,true)*//*
//问题和答案都在资源文件
new Question(R.string.question1, R.string.false_answer) ,
new Question(R.string.question2,R.string.true_answer) ,
new Question(R.string.question3, R.string.true_answer),
new Question(R.string.question4,R.string.true_answer)
};*/
private Question[] mQuestionBank;
private int mCurrentIndex = 0;
private int[] flag; //答题情况,0未答,1正确,2错误
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_quiz);
//初始化问题数组
Resources res=getResources();
String[] questions=res.getStringArray(R.array.questions);
String[] answers=res.getStringArray(R.array.answers);
int length=questions.length;
mQuestionBank=new Question[length];
for(int i=0;i<length;i++){
mQuestionBank[i]=new Question(questions[i],answers[i]);
}
//初始化答题情况数组
flag=new int[length];
//引用文本框,将其设置为问题内容
mQuestionTextView = (TextView) findViewById(R.id.question_text_view);
// int question = mQuestionBank[mCurrentIndex].getTextResId();
// mQuestionTextView.setText(question) ;
updateQuestion();
//正确按钮
mTrueButton=(Button) findViewById(R.id.true_button);
mTrueButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
// Toast.makeText(QuizActivity.this,R.string.correct_toast,Toast.LENGTH_SHORT).show();
checkAnswer(true);
if (flag[mCurrentIndex]!=0){ //已答题
mTrueButton.setEnabled(false); //禁掉作答按钮
mFalseButton.setEnabled(false);
}
}
});
//错误按钮
mFalseButton=(Button) findViewById(R.id.false_button);
mFalseButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
// Toast.makeText(QuizActivity.this,R.string.incorrect_toast,Toast.LENGTH_SHORT).show();
checkAnswer(false);
if (flag[mCurrentIndex]!=0){ //已答题
mTrueButton.setEnabled(false); //禁掉作答按钮
mFalseButton.setEnabled(false);
}
}
});
//设置next按钮
mNextButton = (Button) findViewById(R.id.next_button) ;
mNextButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
if(mCurrentIndex<mQuestionBank.length-1)
mCurrentIndex = (mCurrentIndex + 1) % mQuestionBank.length;
// int question = mQuestionBank[mCurrentIndex].getTextResId();
// mQuestionTextView.setText(question) ;
updateQuestion();
if (flag[mCurrentIndex]==0){ //按钮解禁
mTrueButton.setEnabled(true);
mFalseButton.setEnabled(true);
}else{
mTrueButton.setEnabled(false); //禁掉作答按钮
mFalseButton.setEnabled(false);
}
}
});
mPreButton = (Button) findViewById(R.id.pre_button) ;
mPreButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
if(mCurrentIndex>0)
mCurrentIndex = (mCurrentIndex - 1) % mQuestionBank.length;
updateQuestion();
if (flag[mCurrentIndex]==0){ //按钮解禁
mTrueButton.setEnabled(true);
mFalseButton.setEnabled(true);
}else{
mTrueButton.setEnabled(false); //禁掉作答按钮
mFalseButton.setEnabled(false);
}
}
});
}
//更新问题
private void updateQuestion() {
// int question = mQuestionBank[mCurrentIndex].getTextResId();
String question=mQuestionBank[mCurrentIndex].getQuestionString();
mQuestionTextView.setText(question) ;
}
//判断答案对错
private void checkAnswer(boolean userPressedTrue) {
// boolean answerIsTrue = mQuestionBank[mCurrentIndex].isAnswerTrue();
// boolean answerIsTrue=Boolean.parseBoolean(getResources().getString(mQuestionBank[mCurrentIndex].getAnswerId()));
boolean answerIsTrue=Boolean.parseBoolean(mQuestionBank[mCurrentIndex].getAnswerString());
int messageResId = 0;
if (userPressedTrue == answerIsTrue){
messageResId = R.string.correct_toast;
flag[mCurrentIndex]=1; //记录
}
else {
messageResId = R.string.incorrect_toast;
flag[mCurrentIndex]=2; //记录
}
Toast.makeText(this, messageResId,Toast.LENGTH_SHORT).show( );
if(mCurrentIndex==mQuestionBank.length-1){ //答题完毕
double trueNum=0;
for (int i=0;i<flag.length;i++){
if(flag[i]==1)
trueNum++;
// System.out.println(trueNum);
}
trueNum=trueNum/(mQuestionBank.length*1.0); //正确率
NumberFormat format = NumberFormat.getPercentInstance();
format.setMaximumFractionDigits(2);//设置保留几位小数
System.out.println("百分比为:"+format.format(trueNum));
Toast.makeText(this,"正确率:"+format.format(trueNum),Toast.LENGTH_SHORT).show();
}
}
activity_quiz.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".QuizActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="24dp"
android:id="@+id/question_text_view"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/true_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_weight="1"
android:text="@string/true_button" />
<Button
android:id="@+id/false_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_weight="1"
android:text="@string/false_button" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/pre_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:text="@string/pre_button"
android:drawableRight="@drawable/arrow_left"
android:drawablePadding="4dp"/>
<Button
android:id="@+id/next_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:text="@string/next_button"
android:drawableRight="@drawable/arrow_right"
android:drawablePadding="4dp"/>
</LinearLayout>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
string.xml和array.xml
<resources>
<string name="app_name">GeoQuiz</string>
<string name="true_button">正确</string>
<string name="false_button">错误</string>
<!-- <string name="question_text">你不是机器人?</string>-->
<string name="question1">你是机器人吗?</string>
<string name="question2">陌刀将军是李嗣业吗?</string>
<string name="question3">男生宿舍是6个人吗?</string>
<string name="question4">真的有人学计算机吗?</string>
<string name="correct_toast">正确!</string>
<string name="incorrect_toast">错误!</string>
<string name="next_button">Next</string>
<string name="pre_button">Pre</string>
<string name="true_answer">true</string>
<string name="false_answer">false</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="questions">
<item>你是机器人吗?</item>
<item>陌刀将军是李嗣业吗?</item>
<item>男生宿舍是6个人吗?</item>
<item>真的有人学计算机吗?</item>
</string-array>
<string-array name="answers">
<item>false</item>
<item>true</item>
<item>true</item>
<item>true</item>
</string-array>
</resources>