Android随机多项选择测验:如何识别正确答案

2024-01-06

我正在尝试为 Android 创建一个随机多项选择测验。我想显示字符串数组中的随机问题,另一个字符串数组的相应答案显示在四个选项之一中。其他三个选项将来自另一个字符串数组,该数组将用于随机提供所有问题的“错误”答案。

两个问题: 有没有更好的方法来进行这样的多项选择测验? -和- 当玩家选择答案时,如何识别答案来自哪个数组?

这是我用来随机化的代码:

String[] question = { //questions here// };  
ArrayList<String> questionList = new ArrayList(Arrays.asList(question));  

String[] answer = { //answers here// };  
ArrayList<String> answerList = new ArrayList(Arrays.asList(answer));

String[] distractor = { //distractors here// };  
ArrayList<String> distractorList = new ArrayList(Arrays.asList(distractor));  

int i = 0;  
Random r = new Random();  
public void randomize() {

        TextView word = (TextView) findViewById(R.id.textView1);
        TextView choice1 = (TextView) findViewById(R.id.textView2);
        TextView choice2 = (TextView) findViewById(R.id.textView3);
        TextView choice3 = (TextView) findViewById(R.id.textView4);
        TextView choice4 = (TextView) findViewById(R.id.textView5);
        if (i < question.length) {
            int remaining = r.nextInt(questionList.size());
            String q = questionList.get(remaining);
            word.setText(q);
            questionList.remove(remaining);
            String a = answerList.get(remaining);
            int slot = r.nextInt(4);
            TextView[] tvArray = { choice1, choice2, choice3, choice4 };
            tvArray[slot].setText(a);
            answerList.remove(remaining);
          //an if/else statement here to fill the remaining slots with distractors

我建议创建一个名为 QuestionAndAnswer 的新类。该类应该保存问题和正确答案,它还可以保存任何自定义的错误答案和用户的选择。确切的实施完全取决于您。

在您的活动中,有一个此问答类的数组,可以在列表中循环询问问题并在完成后统计分数。

(如果您包含您尝试过的相关代码,我可以更具体。)


Addition

这就是我要开始的:
(从你的代码我猜测distractorList包含您想要显示的错误答案。)

public class QuestionAndAnswer {
    public List<String> allAnswers; // distractors plus real answer
    public String answer;
    public String question;
    public String selectedAnswer;
    public int selectedId = -1;

    public QuestionAndAnswer(String question, String answer, List<String> distractors) {
        this.question = question;
        this.answer = answer;
        allAnswers = new ArrayList<String> (distractors);

        // Add real answer to false answers and shuffle them around 
        allAnswers.add(answer);
        Collections.shuffle(allAnswers);
    }

    public boolean isCorrect() {
        return answer.equals(selectedAnswer);
    }
}

对于该活动,我将您的四个答案 TextView 更改为 RadioGroup,这样用户可以直观地选择答案。我也假设会有prev and next按钮,它们会调整int currentQuestion并打电话fillInQuestion().

public class Example extends Activity {
    RadioGroup answerRadioGroup;
    int currentQuestion = 0;
    TextView questionTextView;
    List<QuestionAndAnswer> quiz = new ArrayList<QuestionAndAnswer>();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        questionTextView = (TextView) findViewById(R.id.question);
        answerRadioGroup = (RadioGroup) findViewById(R.id.answers);

        // Setup a listener to save chosen answer
        answerRadioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                if(checkedId > -1) {
                    QuestionAndAnswer qna = quiz.get(currentQuestion);
                    qna.selectedAnswer = ((RadioButton) group.findViewById(checkedId)).getText().toString();
                    qna.selectedId = checkedId;
                }
            }
        });

        String[] question = { //questions here// };  
        String[] answer = { //answers here// };  
        String[] distractor = { //distractors here// };  
        ArrayList<String> distractorList = Arrays.asList(distractor);  

        /* I assumed that there are 3 distractors per question and that they are organized in distractorList like so:
         *   "q1 distractor 1", "q1 distractor 2", "q1 distractor 3", 
         *   "q2 distractor 1", "q2 distractor 2", "q2 distractor 3",
         *   etc
         *   
         * If the question is: "The color of the sky", you'd see distractors:
         *   "red", "green", "violet"
         */   
        int length = question.length;
        for(int i = 0; i < length; i++)
            quiz.add(new QuestionAndAnswer(question[i], answer[i], distractorList.subList(i * 3, (i + 1) * 3)));
        Collections.shuffle(quiz);

        fillInQuestion();
    }

    public void fillInQuestion() {
        QuestionAndAnswer qna = quiz.get(currentQuestion);
        questionTextView.setText(qna.question);

        // Set all of the answers in the RadioButtons 
        int count = answerRadioGroup.getChildCount();
        for(int i = 0; i < count; i++)
            ((RadioButton) answerRadioGroup.getChildAt(i)).setText(qna.allAnswers.get(i));

        // Restore selected answer if exists otherwise clear previous question's choice
        if(qna.selectedId > -1)
            answerRadioGroup.check(qna.selectedId);
        else 
            answerRadioGroup.clearCheck();
    }
}

您可能已经注意到 QuestionAndAnswer 有一个 isCorrect() 方法,当需要对测验评分时,您可以像这样计算正确答案:

int correct = 0;
for(QuestionAndAnswer question : quiz)
    if(question.isCorrect())
        correct++;

这是我的总体想法。代码是一个完整的思想,所以它会编译。当然,您需要添加一个“下一个”按钮来查看不同的问题。但这足以让您看到一种在保持问题和答案井然有序的同时随机化您的问题和答案的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android随机多项选择测验:如何识别正确答案 的相关文章

  • 如何将参数传递给Workmanager DoWork方法

    我想安排任务在 24 小时后从数据库中删除 public class WorkManager extends Worker public WorkManager NonNull Context context NonNull WorkerP
  • Android studio 3.0不生成签名的apk

    将 android studio 更新到版本 3 0 Windows 后 我无法生成签名的 APK 构建完成后 我收到消息 单击 查找 会将我带到 APP 文件夹 但找不到 APK 改变了什么 自Android Studio 3 0更新后
  • VB.NET 中字节数组的数组

    我需要一个数组 数组中的每个项目都是这样的字节数组 但我不知道如何执行以下操作 Dim xx as array xx 0 as byte H12 HFF xx 1 as byte H45 HFE 您可以像这样创建嵌套或 锯齿状 字节数组 D
  • 文本末尾有额外的换行符

    使用此方法设置文本后 我似乎得到了一些额外的换行符TextView message setText Html fromHtml message 我怎样才能删除这些 它们导致我的布局扭曲 因为它在输出中添加了两条额外的行 该字符串已通过以下方
  • 底部导航视图 - 渐变图标色调

    I have changed icon tint in BottomNavigationView using selector and gradient color as tint when icon is pressed but inst
  • 错误只有 size-1 数组可以转换为 Python 标量

    我有这个代码 for a in data X for i in a if not i isdigit x hash i data X column row x row row 1 row 0 column column 1 desired
  • 更新到 3.2.0 后 Gradle 构建失败

    因此 在将 Gradle 插件更新到 3 2 0 并将 gradle wrapper 更新到 4 6 后 我遇到了问题 Android Studio 版本是 3 2 使用 Gradle 版本 即 alpha 11 也没有结果 什么地方出了错
  • 添加数组的总和。显示1个输出

    更新 这个问题的答案如下 感谢在不同线程上进行的 dougtesting 将数组相加 显示总和 https stackoverflow com questions 45724641 add array together display su
  • 将对象传递给活动

    我可以在第一个活动中初始化对象并在所有活动中初始化对象吗 public class Calc int x int y public Calc int x int y this x x this y y public int sum retu
  • RecyclerView onClick notificationItemRemoved 不会触发 onBindView

    I use notifyItemRemoved 方法我想更改其他剩余项目 但该方法没有触发onBindView 方法 除了使用notifyDataSetChanged 我想要附带的动画notifyItemRemoved method 如果您
  • 如何更改Android软键盘中任意键的按键背景

    我想让键盘上的一些键与其他键不同 例如下图中的shift 删除 空格键 根据google的参考文档 我们可以通过使用 来改变按键的背景android keybackground drawable xxx in input xml 但它改变了
  • 如何在列表视图中选择时启用视频序列自动播放?

    大家好 有人可以与我分享一下我如何编写我的 viewvideo java 类 以便它允许自动播放视频功能 自动排序在列表视图中播放所选视频的任务 从当前位置到最新录制的视频 按顺序直到最新的视频播放完毕 这类似于 YouTube 自动播放功
  • 在Android项目中引用(纯java)项目(找不到类)

    我试图在我的 Android 项目中引用一个纯 java 项目 gt Java 项目有一大堆我需要使用的类 哦 正如第一个回复所指出的 我正在使用 eclipse 是的 唯一的问题是 我总是找不到类 XXX 从方法 com example
  • 如何在没有片段的情况下使用导航抽屉?

    我正在尝试遵循这个tutorial https developer android com training implementing navigation nav drawer html关于如何创建导航抽屉 但我不想在用户从抽屉列表中选择
  • ListPreferences 的异常

    这是我的第一个 Android 应用程序 在尝试使用 ListPreference 时遇到了异常 应用程序与首选项一起加载 但是当我触摸 ListPreference 条目时 应用程序 意外停止 设置 java public class S
  • 致命异常:OkHttp 调度程序

    我在 Android 应用程序中使用 OkHttp 库向天气 API 发出 Web 请求 我已经实现了我的代码 但在执行请求时遇到了致命异常 我也已经在我的清单中添加了互联网权限 MainActivity java private Curr
  • java.lang.IllegalStateException:FragmentManager 已被销毁

    活动中onResume我称之为 volley request 的方法 它获取项目列表 然后将它们加载到此活动内的 ListFragment 中 当我第一次进入活动时 一切正常 但当我重新进入活动时 ListFragment 为空 并且控制台
  • 访问手机内部存储以推送 SQLite 数据库文件

    我正在使用 Netbeans 和 java 开发我的 Android 应用程序 当我使用模拟器时 我可以访问文件资源管理器并通过访问以下路径将 SQLite 数据库插入到设备内存中 data data com example helloan
  • 为 C++ 类播种 rand()

    我正在开发一个 C 类 它使用rand 在构造函数中 我真的希望这个班级在几乎所有方面都能照顾好自己 但我不知道在哪里播种rand 如果我播种rand 在构造函数中 每次构造我的对象类型的新实例时都会对其进行播种 因此 如果我按顺序创建 3
  • 更改 ActionMode 溢出图标

    有没有办法更改 ActionMode Overflow 图标而不更改 正常 ActionBar 的图标 我仍然需要弄清楚如何仅更改 ActionMode Actionbar 内部的溢出图标 因为我更改了默认操作栏中的溢出图标 该图标在 Ac

随机推荐

  • Android 屏幕方向,晃动手机导致应用程序崩溃

    我有搜索应用程序 它加载从网络服务检索的数据 创建应用程序时 它会显示进度对话框 一旦完成加载数据 它就会关闭进度对话框 问题是在加载时 如果我改变手机的方向 它工作正常 它会尝试再次加载活动 但如果我在加载数据时开始摇动手机 应用程序就会
  • 动画 UIStackView 排列子视图内容大小变化

    当其内在内容大小发生变化时 是否可以对排列的子视图进行动画处理 例如 假设我有一个已排列的子视图 其中包含固定到边缘的单个 UILabel 该标签有少量文字 新文本出现 比之前的文本大 标签的内在内容尺寸现在更大 我希望能够像这样制作动画
  • 位域的意外行为

    我编译了代码 include
  • 如何使用 Carrierwave 上传自定义 S3 元数据

    我想添加Content Disposition我使用 Carrierwave 上传的文件的标头 之后不能通过 URL 中的查询参数执行此操作 有什么我可以添加到的吗AttachmentUploader在上传文件之前 可以帮助我完成此任务的模
  • Android Studio:按钮始终出现在前面

    我有一个相对布局 我向其中添加视图 我向其中添加了一个按钮 该按钮始终显示在添加到其中的所有其他视图的前面 无论添加内容的顺序如何 怎么会 我纯粹使用 Java 编写代码 没有使用 XML 这是一个简单的示例 即使文本是最后添加的 按钮也会
  • Fabric crashlytics 新实施不起作用 |织物特性

    实施将apiSecret and apiKey in the fabric properties文件不再工作 织物属性文件 app fabric properties apiSecret xx68f6074dxxxxxc11dxxx97c1
  • Python 套接字在远程消耗所有数据之前关闭

    我正在编写一个 Python 模块 它通过 unix 套接字与 go 程序进行通信 客户端 python 模块 将数据写入套接字 服务器使用它们 Simplified version of the code used outputStrea
  • 如何将点击手势转换为 SwiftUI 地图视图中的坐标?

    我正在尝试添加一个MapAnnotation项目到我的Map 查看自MapKit 如果您在文本字段中手动添加坐标 则一切正常 但我找不到任何通过点击地图来添加坐标的方法 我在互联网上阅读了很多内容 但没有找到任何内容onTap 地图事件处理
  • 未定义错误:“current_user”未定义

    我有一个带有烧瓶的应用程序 以前可以使用 但现在我使用蓝图并尝试运行它 但出现错误 所以我想知道这就是 g user 不工作的蓝图问题 我该如何修复它 谢谢 应用程序 布局 init py from flask import Bluepri
  • Summernote div 更改时 Textarea 值发生变化

    我为 Summernote 设置了一个 div 来更改从数据库中提取的文本 div class form control div document ready function summernote summernote height 30
  • 如何在javascript中“重新启用”特殊字符序列?

    如果我有一个定义的字符串变量 例如 var testString not n new line 它的价值当然是not n new line 但如果直接使用 not n new line 测试字符串将包含新行 那么最简单的方法是什么测试字符串
  • 为什么我一定要揭开脆弱的自己?

    我创建了一个名为VerifyObject 其中包含具有类似签名的函数 typealias handlerCodeID String gt Void class func checkPause withID String runOnPause
  • 为什么嵌套的describe()块看不到外部块中定义的变量?

    我在实际代码中遇到了这个问题 但我整理了一个简单的例子来证明这一点 下面的代码工作正常 我在我的根目录中设置了一个变量describe 在我的子系统中可以访问的块describe s it blocks describe simple ob
  • Fortran SAVE 语句

    我读过有关save 英特尔 语言参考文档中的声明 但我不太明白它的作用 有人可以用简单的语言向我解释一下当save语句包含在模块中 原则上 当模块超出范围时 该模块的变量将变为未定义 除非使用 SAVE 属性声明它们 或者使用 SAVE 语
  • ViewPager2 上的 TransactionTooLargeException

    我看到了很多关于 ViewPager 的问题 但现在它已经上线了ViewPager2 我得到了一个java lang RuntimeException android os TransactionTooLargeException data
  • CKEditor - 使用数据处理器删除脚本标签

    我对 CKEditor 还很陌生 两天前开始使用它 而且我仍在与一些配置作斗争 例如从编辑器中删除标签 例如 如果用户在源模式下键入以下内容 我想将其删除 查看文档 我发现这可以使用 HTML 过滤器来完成 我这样定义了它 但它不起作用 v
  • 如何增加 JVM 内存? [复制]

    这个问题在这里已经有答案了 你好 我想知道我是否可以根据我的应用程序增加 JVM 内存 如果可以 我该如何增加 JVM 内存 我怎样才能知道 JVM 的大小 启动 JVM 时 可以调整两个参数以满足您的内存需求 Xms
  • 如何通过 Jayway JsonPath 展平带有嵌套列表的 json?

    目前我需要根据配置处理一些 json 结果 而不是硬代码 例如 json如下 data orderNo CG8310150 details skuId 4384 amount 2 skuId 4632 amount 5 orderNo CG
  • 如何让greatmonkey 检查页面上是否找到文本

    我确实在谷歌和用户脚本网站上做了一些研究 但没有成功找到答案 那么基本上我如何检查页面上是否找到特定文本 并且文本没有特殊标签或任何东西 对于 FF GM 来说 一个粗略但快速的方法 if Text you are looking for
  • Android随机多项选择测验:如何识别正确答案

    我正在尝试为 Android 创建一个随机多项选择测验 我想显示字符串数组中的随机问题 另一个字符串数组的相应答案显示在四个选项之一中 其他三个选项将来自另一个字符串数组 该数组将用于随机提供所有问题的 错误 答案 两个问题 有没有更好的方