题目信息
实现用户在线答题的功能,要求如下,运行效果如下图所示:
1. 全部为单项选择题;
2. 每个题目由1个题面和4个选项组成;
3. 用户点击开始按键后,开始答题和计时;
4. 答题时,用户做出选择后,自动跳转到下一题;全部答完后,使用Toast提示框提示用户的答对、答错的个数和总共耗时。
5. 在界面上方显示当前已答个数和待答个数。
6. 题面、选项和答案,作为数组资源保存,如下:
7.
<string-array name="testTitle">
<item>为了使android适应不同分辨率的机型,布局时字体单位应用</item>
<item>在手机开发中,常用的数据库是哪一个?</item>
<item>下列哪个属性是专用于相对布局的?</item>
</string-array>
<string-array name="testOption1">
<item>dp</item>
<item>dip</item>
<item>px</item>
<item>sp</item>
</string-array>
<string-array name="testOption2">
<item>Oracle</item>
<item>DB2</item>
<item>Mysql</item>
<item>SQLite</item>
</string-array>
<string-array name="testOption3">
<item>layout_toRightOf</item>
<item>stretchColumns</item>
<item>layout_width</item>
<item>orientation</item>
</string-array>
<array name="testOptionAll">
<item>@array/testOption1</item>
<item>@array/testOption2</item>
<item>@array/testOption3</item>
</array>
<integer-array name="anwser">
<item>4</item>
<item>4</item>
<item>1</item>
</integer-array>
8. 知识点补充:
隐藏组件:radioGroup.setVisibility(View.INVISIBLE);
取当前的时间:System.currentTimeMillis()
清除当前选择:radioGroup.clearCheck();
解析:
1. 在res的values目录下创建arrays存放数组信息
2. 在layout下创建xml ,写出页面的组件的
3. 在java中创建空的activity , 写出响应xml布局的代码。
思路分析:
4. 创建layout布局 写出初始的xml页面
5. 创建activity,加载layout页面
方法一:
6. 第1步: 定义页面组件,通过id获取页面对应的控件(R.layout.***)
最好是用到哪个定义哪个,否则思路容易乱。
7. 第2步: 获取数组资源信息
Resources resources = getResources();
testTile = resource.getStringArray(R.array.testTitle);
......
此题我的代码是: 将定义控件和获取数组资源封装到一个方法体内,进行调用。 目的:增强代码可读性
8. 第3步: 点击开始按钮之前,隐藏题目信息
radioGroup.setVisibility(View.GONE);
9. 第4步: 点击开始按钮之后,获取当前时间(据197*年1月1日的毫秒值)
答题完毕后,再获取字词时间,取差,除以1000得到答题用时的秒数
final long beginTime = System.currentTimeMillis();
10. 第5步: 将隐藏的单选框显示出来 并 调用显示题目信息和选项信息的方法
radioGroup.setVisibility(View.VISIBLE);
showTitleAndOption(); 该方法为自定义封装的用于显示题目和选项信息的方法
11. 第6步: 在showTitleAndOption()中显示,答题数目的提示信息,即已答几题,剩余几题,TextView.setText。
然后判断是否为最后一题,若是退出方法。
根据简单的逻辑即可写出,不再赘述,可参考下文代码。
12. 第7步: 设置radioGroup点击事件,当点击选项是触发执行该方法
方法内部使用switch-case进行,对选项的判断,设置临时值判断是否和答案数组中的值一致
若一致,则回答正确 rightCounts++,
无论是否回答正确,都要根据数组索引index2++(初始为0,++在后面,先按当前值运算,运算结束后++)
判断当前题目是否为最后一题,
若是,隐藏题目信息,计时结束显示回答结果
否则,索引index++ , 执行显示(下一题)题目和选项的方法 showTitleAndOption();
13. 奥利给 自己写一遍!
方法二:
15. 第1步:复制粘贴 。
arrays代码,名称为:arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="testTitle">
<item>为了使android适应不同分辨率的机型,布局时字体单位应用</item>
<item>在手机开发中,常用的数据库是哪一个?</item>
<item>下列哪个属性是专用于相对布局的?</item>
</string-array>
<string-array name="testOption1">
<item>dp</item>
<item>dip</item>
<item>px</item>
<item>sp</item>
</string-array>
<string-array name="testOption2">
<item>Oracle</item>
<item>DB2</item>
<item>Mysql</item>
<item>SQLite</item>
</string-array>
<string-array name="testOption3">
<item>layout_toRightOf</item>
<item>stretchColumns</item>
<item>layout_width</item>
<item>orientation</item>
</string-array>
<array name="testOptionAll">
<item>@array/testOption1</item>
<item>@array/testOption2</item>
<item>@array/testOption3</item>
</array>
<integer-array name="anwser">
<item>4</item>
<item>4</item>
<item>1</item>
</integer-array>
</resources>
xml布局代码,名称为:layout_ans_online.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/h3_tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp" />
<Button
android:id="@+id/h3_bt"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:textColor="#000"
android:text="开始"
android:textSize="20sp" />
<TextView
android:id="@+id/h3_tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp" />
<RadioGroup
android:id="@+id/rg_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<RadioButton
android:id="@+id/h3_rb_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<RadioButton
android:id="@+id/h3_rb_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<RadioButton
android:id="@+id/h3_rb_3"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<RadioButton
android:id="@+id/h3_rb_4"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RadioGroup>
</LinearLayout>
activity(java)代码
package cn.edu.sdufe.sn20180664289;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class AnswerQuestionsOnline extends AppCompatActivity {
private RadioButton radioButton1, radioButton2, radioButton3, radioButton4;
private RadioGroup radioGroup;
private TextView alter_message, tv_title;
private int[] testAnsware;
private String[] testTitle;
private TypedArray typedArray;
private int rightCounts, al_counts, index, len, index2, t=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_ans_online);
//调用 获取数组资源,并根据id获得组件资源 的方法
getArrayAndAssembly();
//获得存储题目的数组的长度,即题目数量
len = testTitle.length;
//点击开始按钮之前,隐藏题目信息
radioGroup.setVisibility(View.GONE);
//获取页面组件
findViewById(R.id.h3_bt).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//将隐藏的单选框显示出来
radioGroup.setVisibility(View.VISIBLE);
//点击开始按钮后 计时开始
final long beginTime = System.currentTimeMillis();
//调用显示题目信息和选项信息的方法
showTitleAndOption();
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.h3_rb_1:
if (R.id.h3_rb_1 == checkedId) t = 1;
case R.id.h3_rb_2:
if (R.id.h3_rb_2 == checkedId) t = 2;
case R.id.h3_rb_3:
if (R.id.h3_rb_3 == checkedId) t = 3;
case R.id.h3_rb_4:
if (R.id.h3_rb_4 == checkedId) t = 4;
//判断题目是否回答正确
if (t == testAnsware[index2++]) rightCounts++;
if (index == len - 1) {
//答题完毕 计时结束,隐藏题目信息,显示结果信息
radioGroup.setVisibility(View.GONE); //隐藏题目信息
long endTime = System.currentTimeMillis(); //获取答题结束时的系统时间
long time = (endTime - beginTime); //累计用时
String stime = "您答对了" + rightCounts + "个题," + "答错" + (len - rightCounts) + "题," + "耗时 " + time/1000 + " 秒";
Toast.makeText(AnswerQuestionsOnline.this, stime + "", Toast.LENGTH_LONG).show();
}
//选中radioButton时进行的操作,radiobutton是控件在xml文件中的id
radioGroup.clearCheck();
index++;
//显示下一题信息
showTitleAndOption();
break;
}
}
});
}
});
}
/**
* 封装了 获取数组资源 和 根据id获得组件的方法
*/
public void getArrayAndAssembly() {
Resources resources = getResources(); //使用该方法直接得到resource实例
testTitle = resources.getStringArray(R.array.testTitle); //获取存储题目的数组
typedArray = resources.obtainTypedArray(R.array.testOptionAll); //访问TypedArray
testAnsware = resources.getIntArray(R.array.anwser); //获取存储答案的数组
radioButton1 = findViewById(R.id.h3_rb_1); //根据id获取组件
radioButton2 = findViewById(R.id.h3_rb_2); //根据id获取组件
radioButton3 = findViewById(R.id.h3_rb_3); //根据id获取组件
radioButton4 = findViewById(R.id.h3_rb_4); //根据id获取组件
radioGroup = findViewById(R.id.rg_1); //根据id获取组件
tv_title = findViewById(R.id.h3_tv2); //根据id获取组件
alter_message = findViewById(R.id.h3_tv1); //根据id获取组件
}
/**
* 封装了 显示题目信息和选项信息的方法 即:调用数组资源 回写到页面的文本显示框 和 radionButton中
*/
public void showTitleAndOption() {
//设置已答题的提示信息
String s = "您已回答 " + al_counts++ + " 题,还剩 " + (len + 1 - al_counts) + " 题";
alter_message.setText(s);
if (index >= len) return; //如果将题目遍历完毕 则退出方法
tv_title.setText(testTitle[index]);
//填充选项信息,通过typeArray数组
radioButton1.setText(typedArray.getTextArray(index)[0].toString()); //设置radioButton的内容
radioButton2.setText(typedArray.getTextArray(index)[1].toString()); //设置radioButton的内容
radioButton3.setText(typedArray.getTextArray(index)[2].toString()); //设置radioButton的内容
radioButton4.setText(typedArray.getTextArray(index)[3].toString()); //设置radioButton的内容
}
}
效果展示: 展示效果用了毫秒值,可将time/1000 换成秒