热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Android实现简单的答题系统

这篇文章主要为大家详细介绍了Android实现简单的答题系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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 getQuestion(){ 
 List list=new ArrayList(); 
 /* 
  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

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 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  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 newList=new ArrayList(); 
     //将错误题目复制到newList中 
     for(int i=0;i 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 checkAnswer(List list) { 
 List wrOngList= new ArrayList(); 
 for(int i=0;i

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新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了adg架构设置在企业数据治理中的应用。随着信息技术的发展,企业IT系统的快速发展使得数据成为企业业务增长的新动力,但同时也带来了数据冗余、数据难发现、效率低下、资源消耗等问题。本文讨论了企业面临的几类尖锐问题,并提出了解决方案,包括确保库表结构与系统测试版本一致、避免数据冗余、快速定位问题等。此外,本文还探讨了adg架构在大版本升级、上云服务和微服务治理方面的应用。通过本文的介绍,读者可以了解到adg架构设置的重要性及其在企业数据治理中的应用。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
author-avatar
lw65112779
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有