实现用户在线答题的功能,要求如下,运行效果如下图所示: 1. 全部为单项选择题; 2. 每个题目由1个题面和4个选项组成; 3. 用户点击开始按键后,开始答题和计时; 4. 答题时,用

题目信息

实现用户在线答题的功能,要求如下,运行效果如下图所示:
1. 全部为单项选择题;
2. 每个题目由1个题面和4个选项组成;
3. 用户点击开始按键后,开始答题和计时;
4. 答题时,用户做出选择后,自动跳转到下一题;全部答完后,使用Toast提示框提示用户的答对、答错的个数和总共耗时。
5. 在界面上方显示当前已答个数和待答个数。
6. 题面、选项和答案,作为数组资源保存,如下:
7.

 <string-array name="testTitle">
    <item>为了使android适应不同分辨率的机型,布局时字体单位应用</item>
    <item>在手机开发中,常用的数据库是哪一个?</item>
    <item>下列哪个属性是专用于相对布局的?</item>
</string-array>
<string-array name="testOption1">
    <item>dp</item>
    <item>dip</item>
    <item>px</item>
    <item>sp</item>
</string-array>

<string-array name="testOption2">
    <item>Oracle</item>
    <item>DB2</item>
    <item>Mysql</item>
    <item>SQLite</item>
</string-array>

<string-array name="testOption3">
    <item>layout_toRightOf</item>
    <item>stretchColumns</item>
    <item>layout_width</item>
    <item>orientation</item>
</string-array>
<array name="testOptionAll">
    <item>@array/testOption1</item>
    <item>@array/testOption2</item>
    <item>@array/testOption3</item>
</array>
<integer-array name="anwser">
    <item>4</item>
    <item>4</item>
    <item>1</item>
</integer-array>

8. 知识点补充:
隐藏组件:radioGroup.setVisibility(View.INVISIBLE);
取当前的时间:System.currentTimeMillis()
清除当前选择:radioGroup.clearCheck();


解析:

1. 在res的values目录下创建arrays存放数组信息
2. 在layout下创建xml ,写出页面的组件的
3. 在java中创建空的activity , 写出响应xml布局的代码。

思路分析:
4. 创建layout布局 写出初始的xml页面
5. 创建activity,加载layout页面

方法一:
6.1: 定义页面组件,通过id获取页面对应的控件(R.layout.***)
		  最好是用到哪个定义哪个,否则思路容易乱。
7.2: 获取数组资源信息
		Resources resources = getResources();
		testTile = resource.getStringArray(R.array.testTitle);
		......
		此题我的代码是: 将定义控件和获取数组资源封装到一个方法体内,进行调用。 目的:增强代码可读性
8.3: 点击开始按钮之前,隐藏题目信息
          radioGroup.setVisibility(View.GONE);
          
9.4: 点击开始按钮之后,获取当前时间(据197*11日的毫秒值)
		   答题完毕后,再获取字词时间,取差,除以1000得到答题用时的秒数
 		   final long beginTime = System.currentTimeMillis();
10.5: 将隐藏的单选框显示出来  并 调用显示题目信息和选项信息的方法
           radioGroup.setVisibility(View.VISIBLE);
 		   showTitleAndOption();  该方法为自定义封装的用于显示题目和选项信息的方法
11.6:showTitleAndOption()中显示,答题数目的提示信息,即已答几题,剩余几题,TextView.setText。
		   然后判断是否为最后一题,若是退出方法。
		   根据简单的逻辑即可写出,不再赘述,可参考下文代码。
12.7: 设置radioGroup点击事件,当点击选项是触发执行该方法
		   方法内部使用switch-case进行,对选项的判断,设置临时值判断是否和答案数组中的值一致
		   若一致,则回答正确 rightCounts++,
		   无论是否回答正确,都要根据数组索引index2++(初始为0++在后面,先按当前值运算,运算结束后++)
		   判断当前题目是否为最后一题,
		   若是,隐藏题目信息,计时结束显示回答结果
		   否则,索引index++ , 执行显示(下一题)题目和选项的方法 showTitleAndOption();
13.  奥利给 自己写一遍!

方法二:
15.1:复制粘贴 。

arrays代码,名称为:arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="testTitle">
        <item>为了使android适应不同分辨率的机型,布局时字体单位应用</item>
        <item>在手机开发中,常用的数据库是哪一个?</item>
        <item>下列哪个属性是专用于相对布局的?</item>
    </string-array>
    <string-array name="testOption1">
        <item>dp</item>
        <item>dip</item>
        <item>px</item>
        <item>sp</item>
    </string-array>

    <string-array name="testOption2">
        <item>Oracle</item>
        <item>DB2</item>
        <item>Mysql</item>
        <item>SQLite</item>
    </string-array>

    <string-array name="testOption3">
        <item>layout_toRightOf</item>
        <item>stretchColumns</item>
        <item>layout_width</item>
        <item>orientation</item>
    </string-array>
    <array name="testOptionAll">
        <item>@array/testOption1</item>
        <item>@array/testOption2</item>
        <item>@array/testOption3</item>
    </array>
    <integer-array name="anwser">
        <item>4</item>
        <item>4</item>
        <item>1</item>
    </integer-array>
</resources>




xml布局代码,名称为:layout_ans_online.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">


    <TextView
            android:id="@+id/h3_tv1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="20sp" />

    <Button
            android:id="@+id/h3_bt"

            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:textColor="#000"
            android:text="开始"
            android:textSize="20sp" />


    <TextView
            android:id="@+id/h3_tv2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="20sp" />

    <RadioGroup
            android:id="@+id/rg_1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            >

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

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

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

        <RadioButton
                android:id="@+id/h3_rb_4"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
    </RadioGroup>
</LinearLayout>




activity(java)代码

package cn.edu.sdufe.sn20180664289;
import android.content.res.Resources;
import android.content.res.TypedArray;
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 android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
public class AnswerQuestionsOnline extends AppCompatActivity {
    private RadioButton radioButton1, radioButton2, radioButton3, radioButton4;
    private RadioGroup radioGroup;
    private TextView alter_message, tv_title;
    private int[] testAnsware;
    private String[] testTitle;
    private TypedArray typedArray;
    private int rightCounts, al_counts, index, len, index2, t=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_ans_online);
        //调用 获取数组资源,并根据id获得组件资源 的方法
        getArrayAndAssembly();
        //获得存储题目的数组的长度,即题目数量
        len = testTitle.length;
        //点击开始按钮之前,隐藏题目信息
        radioGroup.setVisibility(View.GONE);
        //获取页面组件
        findViewById(R.id.h3_bt).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //将隐藏的单选框显示出来
                radioGroup.setVisibility(View.VISIBLE);
                //点击开始按钮后  计时开始
                final long beginTime = System.currentTimeMillis();
                //调用显示题目信息和选项信息的方法
                showTitleAndOption();
                radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(RadioGroup group, int checkedId) {
                        switch (checkedId) {
                            case R.id.h3_rb_1:
                                if (R.id.h3_rb_1 == checkedId) t = 1;
                            case R.id.h3_rb_2:
                                if (R.id.h3_rb_2 == checkedId) t = 2;
                            case R.id.h3_rb_3:
                                if (R.id.h3_rb_3 == checkedId) t = 3;
                            case R.id.h3_rb_4:
                                if (R.id.h3_rb_4 == checkedId) t = 4;
                                //判断题目是否回答正确
                                if (t == testAnsware[index2++]) rightCounts++;
                                if (index == len - 1) {
                                    //答题完毕 计时结束,隐藏题目信息,显示结果信息
                                    radioGroup.setVisibility(View.GONE);        //隐藏题目信息
                                    long endTime = System.currentTimeMillis();  //获取答题结束时的系统时间
                                    long time = (endTime - beginTime);          //累计用时
                                    String stime = "您答对了" + rightCounts + "个题," + "答错" + (len - rightCounts) + "题," + "耗时 " + time/1000 + " 秒";
                                    Toast.makeText(AnswerQuestionsOnline.this, stime + "", Toast.LENGTH_LONG).show();
                                }

                                //选中radioButton时进行的操作,radiobutton是控件在xml文件中的id
                                radioGroup.clearCheck();
                                index++;
                                //显示下一题信息
                                showTitleAndOption();
                                break;
                        }
                    }
                });
            }
        });
    }
    /**
     * 封装了 获取数组资源 和 根据id获得组件的方法
     */
    public void getArrayAndAssembly() {
        Resources resources = getResources();  //使用该方法直接得到resource实例
        testTitle = resources.getStringArray(R.array.testTitle);  //获取存储题目的数组
        typedArray = resources.obtainTypedArray(R.array.testOptionAll); //访问TypedArray
        testAnsware = resources.getIntArray(R.array.anwser); //获取存储答案的数组
        radioButton1 = findViewById(R.id.h3_rb_1);   //根据id获取组件
        radioButton2 = findViewById(R.id.h3_rb_2);   //根据id获取组件
        radioButton3 = findViewById(R.id.h3_rb_3);   //根据id获取组件
        radioButton4 = findViewById(R.id.h3_rb_4);   //根据id获取组件
        radioGroup = findViewById(R.id.rg_1);        //根据id获取组件
        tv_title = findViewById(R.id.h3_tv2);        //根据id获取组件
        alter_message = findViewById(R.id.h3_tv1);   //根据id获取组件
    }
    /**
     * 封装了 显示题目信息和选项信息的方法 即:调用数组资源 回写到页面的文本显示框 和 radionButton中
     */
    public void showTitleAndOption() {
        //设置已答题的提示信息
        String s = "您已回答 " + al_counts++ + " 题,还剩 " + (len + 1 - al_counts) + " 题";
        alter_message.setText(s);
        if (index >= len) return; //如果将题目遍历完毕 则退出方法
        tv_title.setText(testTitle[index]);
        //填充选项信息,通过typeArray数组
        radioButton1.setText(typedArray.getTextArray(index)[0].toString()); //设置radioButton的内容
        radioButton2.setText(typedArray.getTextArray(index)[1].toString()); //设置radioButton的内容
        radioButton3.setText(typedArray.getTextArray(index)[2].toString()); //设置radioButton的内容
        radioButton4.setText(typedArray.getTextArray(index)[3].toString()); //设置radioButton的内容
    }
}





效果展示: 展示效果用了毫秒值,可将time/1000 换成秒

在这里插入图片描述

  • 9
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值