Android实训案例(九)——答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程


项目也是偷师的,决心研究一下数据库。所以写的还是很详细的,各位看官,耐着性子看完,实现结果不重要,思路一定要清晰,我们做一个简单的项目,所以也就设计的比较简陋了,首先新建一个项目——AnswerSystem

一.实现项目框架

主页面就是一个问题,四个答案,还有一个正确答案,最后就是翻页了,正确答案默认是隐藏的,所以我们的layout_mian.xml是这样实现的

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><ScrollView
        android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"><LinearLayout
            android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="20dp"><TextView
                android:id="@+id/tv_title"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="问:刘桂林是何许人也?"android:textColor="@color/colorAccent"android:textSize="22sp"android:textStyle="bold" /><RadioGroup
                android:id="@+id/mRadioGroup"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"><!--四个选项--><RadioButton
                    android:id="@+id/RadioA"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="大帅哥" /><RadioButton
                    android:id="@+id/RadioB"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="参照A" /><RadioButton
                    android:id="@+id/RadioC"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="参照B" /><RadioButton
                    android:id="@+id/RadioD"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="参照C" /><!--正确答案,默认是隐藏的--><TextView
                    android:visibility="invisible"android:id="@+id/tv_result"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="正确答案:肯定选A呀!"android:textColor="@color/colorPrimaryDark"android:textSize="18sp" /></RadioGroup></LinearLayout></ScrollView><!--切换题目--><LinearLayout
        android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:orientation="horizontal"><Button
            android:id="@+id/btn_up"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"android:text="上一题" /><Button
            android:id="@+id/btn_down"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"android:text="下一题" /></LinearLayout></LinearLayout>

我们来预览一下

二.数据库的设计

数据库的话,我们采用一个轻量级数据库编辑器去编辑Sqlite Database Browser

  • 官网地址(墙外面的世界):http://sqlitebrowser.org/

当然,你也可直接搜索这个软件也是可以下载到的,然后点击安装,一步步安装就可以完成了

我们在这里就点击新建数据库——question.db,然后就添加了一些参数,主要就是编号和问题,四个选项,答案,解析等

然后我们点击浏览数据,这里我们可以看到我这里设置的表明对应的说明

既然这样,那我们就多写几个问题吧

紧接着,我们要考虑的一个问题就是,把这个数据库放到软件的数据库里面,所以我先把question.db放在assets目录下,然后通过以下的方法区拷贝到app目录

/*** 将数据库拷贝到相应目录*/private void initFile() {//判断数据库是否拷贝到相应的目录下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();is.close();} catch (IOException e) {e.printStackTrace();}}}

三.答题功能实现

当这个方法执行了之后,你运行了软件,你在data/data/包名/database目录下就可以看到这个数据库了,这样我们就可以先去定义一个类专门用来存储数据——Question

package com.lgl.answersystem;/*** 保存数据库数据* Created by LGL on 2016/6/4.*/
public class Question {/*** 对应的就是Filter1-7  还有一个选中答案*///编号public int ID;//问题public String question;//四个选项public String answerA;public String answerB;public String answerC;public String answerD;//答案public int answer;//详情public String explaination;//用户选中的答案public int selectedAnswer;}

紧接着,我们写一个数据库的类,专门连接数据库和获取数据——DBService

package com.lgl.answersystem;import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;import java.util.ArrayList;
import java.util.List;/*** 连接数据库* Created by LGL on 2016/6/4.*/
public class DBService {private SQLiteDatabase db;//构造方法public DBService() {//连接数据库db = SQLiteDatabase.openDatabase("/data/data/com.lgl.answersystem/databases/question.db", null, SQLiteDatabase.OPEN_READWRITE);}//获取数据库的数据public List<Question> getQuestion() {List<Question> list = new ArrayList<>();//执行sql语句Cursor cursor = db.rawQuery("select * from question", null);if (cursor.getCount() > 0) {cursor.moveToFirst();int count = cursor.getCount();//遍历for (int i = 0; i < count; i++) {cursor.moveToPosition(i);Question question = new Question();//IDquestion.ID = cursor.getInt(cursor.getColumnIndex("Field1"));//问题question.question = cursor.getString(cursor.getColumnIndex("Field2"));//四个选择question.answerA = cursor.getString(cursor.getColumnIndex("Field3"));question.answerB = cursor.getString(cursor.getColumnIndex("Field4"));question.answerC = cursor.getString(cursor.getColumnIndex("Field5"));question.answerD = cursor.getString(cursor.getColumnIndex("Field6"));//答案question.answer = cursor.getInt(cursor.getColumnIndex("Field7"));//解析question.explaination = cursor.getString(cursor.getColumnIndex("Field8"));//设置为没有选择任何选项question.selectedAnswer = -1;list.add(question);}}return list;}}

OK,到这里,我们的数据库算是写好了一大半了,我们这里可以看到,其实就是查询我们的数据库然后封装在这个实体类中,紧接着,我们可以先初始化一些控件

    /*** 初始化View*/private void initView() {tv_title = (TextView) findViewById(R.id.tv_title);mRadioButton[0] = (RadioButton) findViewById(R.id.RadioA);mRadioButton[1] = (RadioButton) findViewById(R.id.RadioB);mRadioButton[2] = (RadioButton) findViewById(R.id.RadioC);mRadioButton[3] = (RadioButton) findViewById(R.id.RadioD);btn_down = (Button) findViewById(R.id.btn_down);btn_up = (Button) findViewById(R.id.btn_up);tv_result = (TextView) findViewById(R.id.tv_result);mRadioGroup = (RadioGroup) findViewById(R.id.mRadioGroup);}

接着就开始实现我们的答题系统了

    /*** 初始化数据库服务*/private void initDB() {DBService dbService = new DBService();final List<Question> list = dbService.getQuestion();count = list.size();corrent = 0;Question q = list.get(0);tv_title.setText(q.question);mRadioButton[0].setText(q.answerA);mRadioButton[1].setText(q.answerB);mRadioButton[2].setText(q.answerC);mRadioButton[3].setText(q.answerD);//上一题btn_up.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (corrent > 0) {corrent--;Question q = list.get(corrent);tv_title.setText(q.question);mRadioButton[0].setText(q.answerA);mRadioButton[1].setText(q.answerB);mRadioButton[2].setText(q.answerC);mRadioButton[3].setText(q.answerD);tv_result.setText(q.explaination);mRadioGroup.clearCheck();//设置选中if (q.selectedAnswer != -1) {mRadioButton[q.selectedAnswer].setChecked(true);}}}});//下一题btn_down.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//判断是否为最后一题if (corrent < count - 1) {corrent++;Question q = list.get(corrent);tv_title.setText(q.question);mRadioButton[0].setText(q.answerA);mRadioButton[1].setText(q.answerB);mRadioButton[2].setText(q.answerC);mRadioButton[3].setText(q.answerD);tv_result.setText(q.explaination);mRadioGroup.clearCheck();//设置选中if (q.selectedAnswer != -1) {mRadioButton[q.selectedAnswer].setChecked(true);}} else {Toast.makeText(MainActivity.this, "最后一题啦!", Toast.LENGTH_SHORT).show();}}});//答案选中mRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {for (int i = 0; i <4 ; i ++){if(mRadioButton[i].isChecked() == true){list.get(corrent).selectedAnswer = i;break;}}}});}

现在的逻辑还是非常的简单的,我们连接数据库拿到数据,点击上一题和下一题的时候,就开始切换数据,我们并没有对他进行什么很难的处理,我们运行一下

四.答错解析

我们在上面实现了答题的功能,同时,也实现了保存选项的功能,拿这样的话,我们就可以再来实现一个判断错误的方法

     /*** 判断是否答题正确* @param list* @return*/private List<Integer> checkAnswer(List<Question>list){List<Integer>wrongList= new ArrayList<>();for(int i = 0 ; i<list.size();i++){//判断对错for (list.get(i).answer != list.get(i).selectedAnswer){wrongList.add(i);}}return wrongList;}

然后我们就可以在点击按钮到最后一题的时候判断是否正确了

//没有题目了,开始检测正确性final List<Integer> wrongList = checkAnswer(list);if(wrongList.size() == 0){new AlertDialog.Builder(MainActivity.this).setTitle("提示").setMessage("你好厉害,答对了所有题!").setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {finish();}}).setNegativeButton("取消",null).show();}//窗口提示new AlertDialog.Builder(MainActivity.this).setTitle("恭喜,答题完成!").setMessage("答对了" + (list.size() - wrongList.size()) + "道题" + "\n"+ "答错了" + wrongList.size() + "道题" + "\n" + "是否查看错题?").setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {wrongMode = true;List<Question> newList = new ArrayList<Question>();for (int i = 0; i < wrongList.size(); i++) {newList.add(list.get(wrongList.get(i)));}list.clear();for (int i = 0; i < newList.size(); i++) {list.add(newList.get(i));}corrent = 0;count = list.size();//更新当前显示的内容Question q = list.get(corrent);tv_title.setText(q.question);mRadioButton[0].setText(q.answerA);mRadioButton[1].setText(q.answerB);mRadioButton[2].setText(q.answerC);mRadioButton[3].setText(q.answerD);tv_result.setText(q.explaination);//显示结果tv_result.setVisibility(View.VISIBLE);}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {finish();}}).show();

这里,开始是一个判断你全答对的情况下,那就直接提示你正确,否则的话,也就开始进行处理了,同时,你要查看错题的话,你就的切换错题模式,我们就重新加载数据了,这里还会有几个情况,比如当我们查看错题有点击到最后一题的时候,我们可以直接弹提示

        else if (corrent == count - 1 && wrongMode == true) {new AlertDialog.Builder(MainActivity.this).setTitle("提示").setMessage("已经到达最后一道题,是否退出?").setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {finish();}}).setNegativeButton("取消",null).show();

这样,我们简单的答题系统就差不多完成了,我们来运行一下

这个实现起来还是比较清晰脱俗的,我们可以点击在数据库里面任意的添加题目,这都是OK的,项目我上传到了Github上,有兴趣的可以看一下哦!

Github:https://github.com/LiuGuiLinAndroid/AnswerSystem

欢迎加群:555974449一起讨论技术兴趣!

Android实训案例(九)——答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程相关推荐

  1. Android实训案例(四)——关于Game,2048方块的设计,逻辑,实现,编写,加上色彩,分数等深度剖析开发过程!...

    Android实训案例(四)--关于Game,2048方块的设计,逻辑,实现,编写.加上色彩.分数等深度剖析开发过程! 关于2048,我看到非常多大神,比方医生.郭神.所以我也研究了一段时间.还好是研 ...

  2. Android实训案例(四)——关于Game,2048方块的设计,逻辑,实现,编写,加上色彩,分数等深度剖析开发过程!

    Android实训案例(四)--关于Game,2048方块的设计,逻辑,实现,编写,加上色彩,分数等深度剖析开发过程! 关于2048,我看到很多大神,比如医生,郭神,所以我也研究了一段时间,还好是研究 ...

  3. Android实训案例(八)——单机五子棋游戏,自定义棋盘,线条,棋子,游戏逻辑,游戏状态存储,再来一局

    Android实训案例(八)--单机五子棋游戏,自定义棋盘,线条,棋子,游戏逻辑,游戏状态存储,再来一局 阿法狗让围棋突然就被热议了,鸿洋大神也顺势出了篇五子棋单机游戏的视频,我看到了就像膜拜膜拜,就 ...

  4. Android实训案例(三)——实现时间轴效果的ListView,加入本地存储,实现恋爱日记的效果!

    Android实训案例(三)--实现时间轴效果的ListView,加入本地存储,实现恋爱日记的效果! 感叹离春节将至,也同时感叹时间不等人,一年又一年,可是我依然是android道路上的小菜鸟,这篇讲 ...

  5. Android实训案例(七)——四大组件之中的一个Service初步了解,实现通话录音功能,抽调接口...

    Service Service的奇妙之处.在于他不须要界面,一切的操作都在后台操作,所以非常多全局性(手机助手,语音助手)之类的应用非常长须要这个.我们今天也来玩玩 我们新建一个project--Se ...

  6. Android实训课程之三 这次课老师先是提到了Android有四大组件:Activity、Service、Broadcast Receiver、Content Provider。然后重点提到Acti

    Android实训课程之三 这次课老师先是提到了Android有四大组件:Activity.Service.BroadcastReceiver.ContentProvider.然后重点提到Activi ...

  7. Java实训项目一一考试系统(附源码)

    1 实训基本信息 1.1 实训项目名称 (1)考试系统 1.2 实训环境 本次实训内容主要针对专业学生,实训形式以实战讲解为主导.实训课程由实训老师主讲,实训老师教学严谨又平易近人,讲解的内容非常细致 ...

  8. android 实训的背景,Android实训项目作业.doc

    Android实训项目作业 2-1用整型数计算两个数的和2 2-7排列任意4个数的顺序,按从小到大顺序输出2 2.1编写显示下列图形的程序.2 3.1编写程序,当点击按钮命令后,页面标题及文本组件的文 ...

  9. 构造中小型园区网实训案例

    构造中小型园区网实训案例 一.实验工具与实验拓扑规划 1.实验工具 2.实验拓扑 二.需求分析 三.数据规划 四.实施步骤 步骤1:配置所有终端 步骤2:配置所有接入层交换机 步骤3:配置网关路由器A ...

最新文章

  1. 在NVIDIA Jetson Xavier NX上安装llvmlite报错:No such file or directory: ‘llvm-config‘: ‘llvm-config‘
  2. 存在于实数域的微观粒子5-可分类性
  3. android 马甲包 app,寻 实力android马甲包上架技术
  4. 《像计算机科学家一样思考Python》——3.9 变量和形参是局部的
  5. 等待指定时间后自动跳转或关闭当前页面
  6. 详解线程本地变量ThreadLocal
  7. nema gps数据转换 matlab,GPS通信的NEMA协议与定位数据的提取.pdf
  8. 事务超时时间无效_Java面试题:Spring事务面试考点的集合整理。建议收藏阅读...
  9. 计算机的配置与选购调查报告,目前主流危机计算机的配置及选购的调查报告.doc...
  10. 哪个行业既锻炼人又便于今后创业?
  11. RISC-V架构能否有效挑战ARM和英特尔?
  12. java静态分页_Javaweb分页
  13. seaweedfs部署及使用(兼容Hadoop)
  14. 全球顶级的5个数据可视化案例
  15. react native使用echarts图表
  16. 简化工作和生活的 7 个在线地图制作平台分享
  17. Android应用去广告方法盘点
  18. 关于socket传输图片
  19. 数据科学家为什么还要学藏语?这不科学。首份藏文数字数据集出炉
  20. Bugzilla安装完初次登录提示“couldn‘t create child process: 720002: index.cgi”解决方法

热门文章

  1. 将123倒转 c语言,中国航信杯C语言程序设计答案解析版.doc
  2. java网络加载协议JNLP的应用
  3. 列表/元组/切片/字典/字符串处理方法
  4. 中国地质调查局:汶川地震原因已有初步的结论
  5. loaded the “XXXView“ nib but the view outlet was not set 解决方案
  6. maven自定义archetype
  7. 【学习笔记】IGMP snooping原理
  8. uAvionix 获得 FAA 批准进行 C 波段测试,并继续在几个新地点推出 SkyLine C2
  9. SSL/TLS协议交互流程分析
  10. [AR/VR教程] SteamVR Unity工具包(二):激光和移动