小编给大家分享一下Android实现简单的答题系统,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
具体内容如下
Question:
package com.example.lenovo.exam;
/**
* Created by lenovo on 2017/12/4.
*/
//保存从数据库中读取的记录
public class Question {
public String question;
public String answerA;
public String answerB;
public String answerC;
public String answerD;
public int answer;
public String explaination;
public int ID ;
//用户选择的答案
public int selectedAnswer;
}
DBService:
使用android自带数据库,下载SQLite Database Browser对数据库进行操作
src main文件夹下创建assests文件夹(此文件夹下的内容在应用被打包成apk时不会被压缩)(存放试题数据库)
在数据库启动时,将该数据库文件复制到数据库目录下
package com.example.lenovo.exam;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import java.util.ArrayList;
import java.util.List;
/**
* Created by lenovo on 2017/12/4.
*/
//连接数据库,并从数据库中获取所需数据
public class DBService {
private SQLiteDatabase db;
//在构造函数中打开指定数据库,并把它的引用指向db
public DBService(){
db=SQLiteDatabase.openDatabase("/data/data/com.example.lenovo.exam/databases/question.db" +
"",null,SQLiteDatabase.OPEN_READWRITE);
}
//获取数据库中的问题
public List<Question> getQuestion(){
List<Question> list=new ArrayList<Question>();
/*
Cursor是结果集游标,用于对结果集进行随机访问,其实Cursor与JDBC中的ResultSet作用很相似。
rawQuery()方法的第一个参数为select语句;第二个参数为select语句中占位符参数的值,如果select语句没有使用占位符,该参数可以设置为null。*/
Cursor cursor =db.rawQuery("select * from question",null);
if(cursor.getCount()>0){
cursor.moveToFirst();//将cursor移动到第一个光标上
int count=cursor.getCount();
//将cursor中的每一条记录生成一个question对象,并将该question对象添加到list中
for(int i=0;i<count;i++){
cursor.moveToPosition(i);
Question question =new Question();
question.ID=cursor.getInt(cursor.getColumnIndex("ID"));
question.question=cursor.getString(cursor.getColumnIndex("question"));
question.answerA=cursor.getString(cursor.getColumnIndex("answerA"));
question.answerB=cursor.getString(cursor.getColumnIndex("answerB"));
question.answerC=cursor.getString(cursor.getColumnIndex("answerC"));
question.answerD=cursor.getString(cursor.getColumnIndex("answerD"));
question.answer=cursor.getInt(cursor.getColumnIndex("answer"));
question.explaination=cursor.getString(cursor.getColumnIndex("explanation"));
//表示没有选择任何选项
question.selectedAnswer=-1;
list.add(question);
}
}
return list;
}
}
ExamActivity:
package com.example.lenovo.exam;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
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 java.util.ArrayList;
import java.util.List;
/**
* Created by lenovo on 2017/12/4.
*/
public class ExamActivity extends Activity {
private int count;
private int current;
private boolean wrongMode;//标志变量,判断是否进入错题模式
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_exam);
DBService dbService = new DBService();
final List<Question> list = dbService.getQuestion();
count = list.size();
current = 0;
wrongMode=false;//默认情况
final TextView tv_question = findViewById(R.id.question);
final RadioButton[] radioButtons = new RadioButton[4];
radioButtons[0] = findViewById(R.id.answerA);
radioButtons[1] = findViewById(R.id.answerB);
radioButtons[2] = findViewById(R.id.answerC);
radioButtons[3] = findViewById(R.id.answerD);
Button btn_previous = findViewById(R.id.btn_previous);
Button btn_next = findViewById(R.id.btn_next);
final TextView tv_explaination = findViewById(R.id.explaination);
final RadioGroup radioGroup = findViewById(R.id.radioGroup);
//为控件赋值
Question q = list.get(0);
tv_question.setText(q.question);
tv_explaination.setText(q.explaination);
radioButtons[0].setText(q.answerA);
radioButtons[1].setText(q.answerB);
radioButtons[2].setText(q.answerC);
radioButtons[3].setText(q.answerD);
btn_next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (current < count - 1) {//若当前题目不为最后一题,点击next按钮跳转到下一题;否则不响应
current++;
//更新题目
Question q = list.get(current);
tv_question.setText(q.question);
radioButtons[0].setText(q.answerA);
radioButtons[1].setText(q.answerB);
radioButtons[2].setText(q.answerC);
radioButtons[3].setText(q.answerD);
tv_explaination.setText(q.explaination);
//若之前已经选择过,则应记录选择
radioGroup.clearCheck();
if (q.selectedAnswer != -1) {
radioButtons[q.selectedAnswer].setChecked(true);
}
}
//错题模式的最后一题
else if(current==count-1&& wrongMode==true){
new AlertDialog.Builder(ExamActivity.this)
.setTitle("提示")
.setMessage("已经到达最后一题,是否退出?")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
ExamActivity.this.finish();
}
})
.setNegativeButton("取消",null)
.show();
}
else{
//当前题目为最后一题时,告知用户作答正确的数量和作答错误的数量,并询问用户是否要查看错题
final List<Integer> wrongList=checkAnswer(list);
//作对所有题目
if(wrongList.size()==0){
new AlertDialog.Builder(ExamActivity.this)
.setTitle("提示")
.setMessage("恭喜你全部回答正确!")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
ExamActivity.this.finish();
}
}).show();
}
else
new AlertDialog.Builder(ExamActivity.this)
.setTitle("提示")
.setMessage("您答对了"+(list.size()-wrongList.size())+
"道题目;答错了"+wrongList.size()+"道题目。是否查看错题?")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int which) {
//判断进入错题模式
wrongMode=true;
List<Question> newList=new ArrayList<Question>();
//将错误题目复制到newList中
for(int i=0;i< wrongList.size();i++){
newList.add(list.get(wrongList.get(i)));
}
//将原来的list清空
list.clear();
//将错误题目添加到原来的list中
for(int i=0;i<newList.size();i++){
list.add(newList.get(i));
}
current=0;
count=list.size();
//更新显示时的内容
Question q = list.get(current);
tv_question.setText(q.question);
radioButtons[0].setText(q.answerA);
radioButtons[1].setText(q.answerB);
radioButtons[2].setText(q.answerC);
radioButtons[3].setText(q.answerD);
tv_explaination.setText(q.explaination);
//显示解析
tv_explaination.setVisibility(View.VISIBLE);
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int which) {
//点击取消时,关闭当前activity
ExamActivity.this.finish();
}
}).show();
}
}
});
btn_previous.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (current > 0)//若当前题目不为第一题,点击previous按钮跳转到上一题;否则不响应
{
current--;
Question q = list.get(current);
tv_question.setText(q.question);
radioButtons[0].setText(q.answerA);
radioButtons[1].setText(q.answerB);
radioButtons[2].setText(q.answerC);
radioButtons[3].setText(q.answerD);
tv_explaination.setText(q.explaination);
//若之前已经选择过,则应记录选择
radioGroup.clearCheck();
if (q.selectedAnswer != -1) {
radioButtons[q.selectedAnswer].setChecked(true);
}
}
}
});
//选择选项时更新选择
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int checkedId) {
for (int i = 0; i < 4; i++) {
if (radioButtons[i].isChecked() == true) {
list.get(current).selectedAnswer = i;
break;
}
}
}
});
}
/*
判断用户作答是否正确,并将作答错误题目的下标生成list,返回给调用者
*/
private List<Integer> checkAnswer(List<Question> list) {
List<Integer> wrongList = new ArrayList<Integer>();
for(int i=0;i<list.size();i++)
{
if(list.get(i).answer!=list.get(i).selectedAnswer){
wrongList.add(i);
}
}
return wrongList;
}
}
MainActivity:
package com.example.lenovo.exam;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String DB_PATH = "/data/data/com.example.lenovo.exam/databases/";
String DB_NAME = "question.db";
//应用启动时,判断数据库是否存在,不存在则将提前打包好的数据库文件复制到数据库目录下
//数据库目录不存在时,创建数据库目录
if ((new File(DB_PATH + DB_NAME).exists()) == false) {
File dir = new File(DB_PATH);
if (!dir.exists()) {
dir.mkdir();
}
}
//定义输入输出流,用于复制文件
try {
InputStream is = getBaseContext().getAssets().open(DB_NAME);
OutputStream os = new FileOutputStream(DB_PATH + DB_NAME);
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
//刷新输出流,关闭输入输出流
os.flush();
os.close();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
Button btn = findViewById(R.id.button);
btn.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, ExamActivity.class);
startActivity(intent);
}
});
}
}
运行截图
以上是“Android实现简单的答题系统”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。