android答题系统(三):答题部分的实现

界面布局exam.xml

<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"
    tools:context="com.mytest.exam.ExamActivity" >

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

            <TextView
                android:id="@+id/ques_question"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

            <RadioGroup
                android:id="@+id/ques_radiogroup"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" >

                <RadioButton
                    android:id="@+id/ques_an1"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" />

                <RadioButton
                    android:id="@+id/ques_an2"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" />

                <RadioButton
                    android:id="@+id/ques_an3"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" />

                <RadioButton
                    android:id="@+id/ques_an4"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" />
            </RadioGroup>

            <TextView
                android:id="@+id/ques_explain"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text=""
                android:visibility="invisible" />
        </LinearLayout>
    </ScrollView>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="6"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/btn_previous"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="上一题" />

        <Button
            android:id="@+id/btn_next"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="下一题" />
    </LinearLayout>

</LinearLayout>

ExamActivity.java

package com.mytest.exam;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;

public class ExamActivity extends Activity {

    private Button btn_next;
    private Button btn_previous;
    private TextView questionView;
    private TextView quesExplainView;
    private RadioButton[] radioButtons;
    private RadioGroup radioGroup;
    private int currQuesIdx = 0;
    private List<Question> quesList;
    private boolean wrongMode = false; // 是否核对答案

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        setContentView(R.layout.exam);

        questionView = (TextView) this.findViewById(R.id.ques_question);
        quesExplainView = (TextView) this.findViewById(R.id.ques_explain);
        radioButtons = new RadioButton[4];
        radioButtons[0] = (RadioButton) findViewById(R.id.ques_an1);
        radioButtons[1] = (RadioButton) findViewById(R.id.ques_an2);
        radioButtons[2] = (RadioButton) findViewById(R.id.ques_an3);
        radioButtons[3] = (RadioButton) findViewById(R.id.ques_an4);
        btn_next = (Button) findViewById(R.id.btn_next);
        btn_previous = (Button) findViewById(R.id.btn_previous);

        radioGroup = (RadioGroup) findViewById(R.id.ques_radiogroup);

        quesList = new DBService().getQuestions();

        currQuesIdx = 0;
        Question currQues = quesList.get(currQuesIdx);

        setQuestionToGadioGroup(currQues);

        addListener();
    }

    private void setQuestionToGadioGroup(Question ques) {
        radioButtons[0].setText(ques.getAnswerA());
        radioButtons[1].setText(ques.getAnswerB());
        radioButtons[2].setText(ques.getAnswerC());
        radioButtons[3].setText(ques.getAnswerD());
        questionView.setText(ques.getQuestion());
        quesExplainView.setText(ques.getExplain());
    }

    private void addListener() {

        // 下一题
        btn_next.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                Log.v("info", "btn_next,currQuesIdx:" + currQuesIdx);

                if (currQuesIdx < quesList.size() - 1) {
                    currQuesIdx++;

                    Question ques = quesList.get(currQuesIdx);
                    setQuestionToGadioGroup(ques);

                    radioGroup.clearCheck();
                    if (ques.getSelectedAnswer() != -1) {
                        radioButtons[ques.getSelectedAnswer()].setChecked(true);
                    }
                } else if (currQuesIdx == quesList.size() - 1) { // 最后一题

                    final List<Integer> wrongList = checkAnswer();
                    if (wrongList.size() < 1) {
                        new AlertDialog.Builder(ExamActivity.this).setTitle("提示").setMessage("恭喜你全部回答正确!")
                                .setPositiveButton("确定", new DialogInterface.OnClickListener() {

                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                ExamActivity.this.finish();

                            }
                        }).show();

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

                        new AlertDialog.Builder(ExamActivity.this)
                                .setTitle("提示").setMessage("您答对了" + (quesList.size() - wrongList.size()) + "道题目,答错了"
                                        + wrongList.size() + "道题目。是否查看错题?")
                                .setPositiveButton("确定", new DialogInterface.OnClickListener() {

                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                wrongMode = true;
                                List<Question> newList = new ArrayList<Question>();
                                for (int i = 0; i < wrongList.size(); i++) {
                                    newList.add(quesList.get(wrongList.get(i)));
                                }
                                quesList.clear();
                                for (int i = 0; i < newList.size(); i++) {
                                    quesList.add(newList.get(i));
                                }

                                currQuesIdx = 0;
                                Question ques = quesList.get(currQuesIdx);
                                setQuestionToGadioGroup(ques);
                                quesExplainView.setVisibility(View.VISIBLE);
                            }

                        }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                ExamActivity.this.finish();
                            }
                        }).show();
                    }

                }
            }
        });

        // 上一题
        btn_previous.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                Log.v("info", "btn_previous,currQuesIdx:" + currQuesIdx);

                if (currQuesIdx > 0) {

                    currQuesIdx--;
                    Question ques = quesList.get(currQuesIdx);
                    setQuestionToGadioGroup(ques);

                    radioGroup.clearCheck();

                    if (ques.selectedAnswer != -1) {
                        radioButtons[ques.selectedAnswer].setChecked(true);
                    }

                }
            }
        });

        radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                for (int i = 0; i < 4; i++) {
                    if (radioButtons[i].isChecked()) {
                        quesList.get(currQuesIdx).setSelectedAnswer(i);
                    }
                }

            }
        });
    }

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

AndroidMainfest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mytest.exam"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.mytest.exam.ExamActivity" >
        </activity>
    </application>

</manifest>

时间: 2024-10-16 05:55:23

android答题系统(三):答题部分的实现的相关文章

android答题系统(一):运行效果

参与极客学院的视频教材“ Android 项目开发实战:答题系统” http://www.jikexueyuan.com/course/1265.html 运行效果 数据中表的测试数据

[黑科技] 使用Word和Excel自制题库自判断答题系统

这篇文章是LZY老师告诉我的一个方法,如果你需要做题库,并且喜欢电子答题的方法,这篇文章或许会对你有所帮助.反正李老师班级的平均成绩高出其他班级的14分,这就是它的好处,希望这篇文章对我今后的学生有所帮助吧!        注意:这篇文章涉及到Word特殊字符.通配符.Excel设置等常见问题.如果文章存在不足或错误的地方,还请海涵~        运行结果如下图所示,正确答案第一列,模拟做题的时候学生将它藏着,然后在E列进行答题,D列是在线判断系统,反复训练从而提升学生的考试分数.哈哈~哎,确

答题系统项目总结

背景 最近这一段日子,绝大部分时间花在一个答题系统上,项目预期是利用扫描仪获取到试卷的数据,随后对数据进行处理以及匹配规则,最终算出该题目的正确答案.目前系统已经开发到第二版本,现在还仅仅是一个简易型的Demo,但是其中涉及到一部分坑以及在工作的时候发现的一些问题,鉴于此,使用文本记录下来,为以后成为优秀程序员铺路搭桥. 首先说一下数据,数据是由做底层算法的同事提供的,使用XML格式存储,绝大部分数学公式都是Latex格式.我所做的事情,其实很简单,就是将数据保存起来,同时提供数据配合前端.但真

结对编程:带ui设计的学生答题系统

带ui的学生答题系统 1.功能 (1)实现登录和注册,可以通过手机验证码进行验证 (2)根据类型和数量出题,生成试卷并且题目不重复 (3)计算分数 2.方法 (1)利用二叉树生成题目,直接计算(答案为小数) (采用逆波兰表达式也可以计算) (2)利用xml存储账户信息 (3)利用正则表达式筛选题目,匹配密码 (4)利用c#的可视化开发工具做界面 3.个人项目复用 (1)虽然个人项目使用的是java,结对项目使用的是c#,但这两门语言有太多相似之处,复制后直接能用. 主要复用了个人项目里的二叉树结

SSH网上答题系统

我要做的事网上答题系统,通过注册登录到答题页面. 这其中数据库的连接靠Hibernate,数据库的增删改查用Sruts2实现. 关于Struts2的学习,仅仅在action的表面上,可以在action里写一些代码,做一些数据处理,而关于struts2的深层的学习还在进行中,这个学习的过程真的很漫长.对于那些老师没有讲过的东西自己学起来真的很慢,很难.

基于jQuery在线问卷答题系统代码

分享一款基于jQuery在线问卷答题系统代码是一款实用的jQuery答题插件,点击下一题切换带有淡入淡出效果.实现的效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class="demo"> <div id='quiz-container'> </div> </div> js代码: var init = { 'questions': [{ 'question': 'jQuery是什么?', 'answers'

Android调用系统相机、自定义相机、处理大图片

Android调用系统相机和自定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显示出来,该例子也会涉及到Android加载大图片时候的处理(避免OOM),还有简要提一下有些人SurfaceView出现黑屏的原因. Android应用拍照的两种方式,下面为两种形式的Demo展示出来的效果.    知识点: 一.调用系统自带的相机应用 二.自定义我们自己的拍照界面 三.关于计算机解析图片原理(如何正确加载图片到Android应用中) 所需

Android 性能优化 三 布局优化ViewStub标签的使用

小黑与小白的故事,通过虚拟这两个人物进行一问一答的形式来共同学习ViewStub的使用 小白:Hi,小黑,ViewStub是什么?听说可以用来进行布局优化. 小黑:ViewStub 是一个隐藏的,不占用内存空间的视图对象,它可以在运行时延迟加载布局资源文件.(更多详细的API等信息可以查看官方文档ViewStub),计算机行业一向是实践里面出真知,下面用一个例子演示下效果. 小黑:说说概念只是为了概括性的了解下,还是用个实例来演示下.先来创建一个Activity中使用的布局文件,文件名是:act

理解 Android Build 系统

http://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/ Android Build 系统是用来编译 Android 系统,Android SDK 以及相关文档的一套框架.众所周知,Android 是一个开源的操作系统.Android 的源码中包含了许许多多的模块. 不同产商的不同设备对于 Android 系统的定制都是不一样的.如何将这些模块统一管理起来,如何能够在不同的操作系统上进行编译,如何在编译时能够支持面向

Android反编译(三)之重签名

Android反编译(三) 之重签名 [目录] 1.原理 2.工具与准备工作 3.操作步骤 4.装X技巧 5.问题 1.原理 1).APK签名的要点 a.所有的应用程序都必须有数字证书 ,Android系统不会安装一个没有数字证书的应用程序: b.Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证: c.数字证书都是存在有效期的,Android只是在应用程序安装的时候才会检查证书的有效期.如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能. d.A