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<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); 

   }
  }); 

 }
}

运行截图

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android实现机房座位预约系统

    本文实例为大家分享了Android实现预约系统的具体代码,供大家参考,具体内容如下 这周要去武汉开会,下周项目就得用上,所以,比较紧.加上导师不懂Android开发,只要开会就改需求,/(ㄒoㄒ)/~~反正他说先让学校用着,移动端和服务器的开发就给了两周时间.所以功能实现的比较简单,但代码做的比较容易扩展,都留了接口,后面更新起来也好做一些.通过这个工程,对Struts2的拦截器有了一些新体会.随着项目变大代码量变多,自然而然就会想起用一些设计模式了.不然代码根本没办法看. 整体是4个fragm

  • Android实现电池管理系统

    一.Android 电池服务 Android电池服务,用来监听内核上报的电池事件,并将最新的电池数据上报给系统,系统收到新数据后会去更新电池显示状态.剩余电量等信息.如果收到过温报警和低电报警,系统会自动触发关机流程,保护电池和机器不受到危害. Android电池服务的启动和运行流程: Android 电池服务的源码结构 Framework\base\services\java\com\android\server         ├── SystemServer.java           

  • Android版学生管理系统

    用户可以输入姓名.性别.年龄三个字段,通过点击添加学生按钮,将学生信息展示到开始为空的ScrollView控件中,ScrollView控件只能包裹一个控件,我这里包裹的是LinearLayout.点击保存数据按钮将数据通过XmlSerializer对象将数据保存到sd卡中,当点击恢复数据按钮时将sd卡文件中的数据读取出来回显到ScrollView中.大概功能就是这样的,下面我们来看看具体的代码吧. 因为要读写文件,所以要在清单文件中添加两个权限: <uses-permission android

  • 直接可用的Android studio学生信息管理系统

    百度上流传最广的版本有所欠缺,并不能直接使用,同时有很多不必要的功能,这是我进行删减.修改.核查后的版本,根据下面的步骤一步步来直接能够运行程序. 本程序实现的功能是增删改查以及全选 首先是程序提纲 主要部分是java文件和xml文件. activity放在java文件里面,xml文件就是布局文件,用来规定界面的显示格式. 类定义的Java文件 StudentDao StudnetDBHelper Student TableContanst 其他文件 string .xml color.xml

  • 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 a

  • 基于java swing实现答题系统

    本文实例为大家分享了java swing实现答题系统的具体代码,供大家参考,具体内容如下 如上图所示,代码亲测可用,如下: import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; im

  • Android 复制文本内容到系统剪贴板的最简单实例(分享)

    这个例子很简单,直接上截图和代码. 布局文件activity_copy.xml代码如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layou

  • Android编程简单实现ImageView点击时背景图修改的方法

    本文实例讲述了Android编程简单实现ImageView点击时背景图修改的方法.分享给大家供大家参考,具体如下: 在使用ImageView时,当被点击时,希望背景图修改一下,这样显示被点击效果明显一些.在这里,一个很简单的方法,最起码是个很清晰的方法.在res/drawable文件夹下创建一个xml文件.比如my.xml,内容如下: <?xml version="1.0" encoding="utf-8"?> <selector xmlns:an

  • android编程获取和设置系统铃声和音量大小的方法

    本文实例讲述了android编程获取和设置系统铃声和音量大小的方法.分享给大家供大家参考,具体如下: 通过程序获取android系统手机的铃声和音量.同样,设置铃声和音量的方法也很简单! 设置音量的方法也很简单,AudioManager提供了方法: public voidsetStreamVolume(intstreamType,intindex,intflags) 其中streamType有内置的常量,去文档里面就可以看到. JAVA代码: AudioManager mAudioManager

  • 解决Android启动APP的一瞬间系统栏会变成蓝色问题

    系统栏已经做过处理,但是在启动APP时系统栏还是会有一瞬间是蓝色的.解决起来很简单,在res/values/style中,把下面代码 <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item nam

  • Android实现简单画图画板

    本文实例为大家分享了Android实现简单画图画板的具体代码,供大家参考,具体内容如下 效果如图: 布局文件: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:

  • Android编程简单实现九宫格示例

    本文实例讲述了Android编程简单实现九宫格.分享给大家供大家参考,具体如下: 实现的步骤 1. 一个整体的容器部分.就是上图中包括整个图片项个各个部分,这里我们使用gridView(表格布局)来实现 2.整个界面里需要注意的是 "重复的部分",就是 各个图片项和,图片下方显示的文字了.那么我们需要描述这个部分.在描述时,要说明图片位于上方,文字位于下方. 3.迭代,或者说重复的将各项 插入(放入)到容器内. 需要添加/修改3个文件:main.xml.meunitem.xml.act

  • Android AnalogClock简单使用方法实例

    本文实例讲述了Android AnalogClock简单使用方法.分享给大家供大家参考,具体如下: AnalogClock组件的使用很简单,先来看看效果图: AnalogClock组件的使用只需要在布局中指定的显示位置写入此组件即可使用,不需要在java代码中进行实例化. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.a

  • 基于CakePHP实现的简单博客系统实例

    本文实例讲述了基于CakePHP实现的简单博客系统.分享给大家供大家参考.具体实现方法如下: PostsController.php文件: <?php class PostsController extends AppController { public $helpers = array('Html', 'Form', 'Session'); public $components = array('Session'); public function index() { $this->set

随机推荐