You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android答题APP开发疑问:1000道题目需创建1000个Activity吗?

绝对不需要为每道题创建单独的Activity!

兄弟,听我一句劝:给每道题/选项建一个Activity是完全错误的做法。别说1000道题,就算10道题,这种方案都会让你的代码维护变得噩梦级困难,还会带来不必要的内存开销。下面给你捋捋正确的实现思路,再附上示例代码。

推荐的实现方案

1. 单Activity + 动态更新UI(最适合你的场景)

如果你的题目都是统一的单选结构(就像你举的例子),这是最简单高效的方案:用一个Activity承载所有题目,每次切换题目时,只更新屏幕上的题目文本、选项内容即可,不需要切换页面。

2. 单Activity + Fragment(适合多题型场景)

如果未来你的APP要支持多种题型(比如多选、填空、判断题),可以给每种题型写一个Fragment,然后在同一个Activity里切换不同的Fragment来展示对应题目。但如果只是单一的单选题,方案1足够用了。

示例代码(单Activity + 动态更新UI,Kotlin版)

首先定义一个数据类来存储题目信息:

data class Question(
    val id: Int,
    val questionText: String,
    val options: List<String>,
    val correctAnswerIndex: Int // 正确选项在options列表中的索引
)

然后是布局文件activity_quiz.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"
    android:padding="16dp">

    <!-- 题目文本 -->
    <TextView
        android:id="@+id/tv_question"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:layout_marginBottom="24dp"/>

    <!-- 选项组 -->
    <RadioGroup
        android:id="@+id/rg_options"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"/>

    <!-- 下一题按钮 -->
    <Button
        android:id="@+id/btn_next"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="下一题"
        android:layout_marginTop="24dp"/>

</LinearLayout>

最后是Activity的逻辑代码:

import android.os.Bundle
import android.view.View
import android.widget.RadioButton
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity

class QuizActivity : AppCompatActivity() {
    private lateinit var tvQuestion: TextView
    private lateinit var rgOptions: RadioGroup
    private lateinit var btnNext: Button

    // 模拟题目列表,实际开发中可以从JSON文件、数据库或接口获取
    private val questions = listOf(
        Question(1, "澳大利亚的首都是哪里?", listOf("堪培拉", "巴黎", "华盛顿", "东京"), 0),
        Question(2, "法国的首都是哪里?", listOf("伦敦", "巴黎", "柏林", "马德里"), 1),
        Question(3, "美国的首都是哪里?", listOf("纽约", "洛杉矶", "华盛顿", "芝加哥"), 2),
        // 这里可以无限添加题目,哪怕1000道都没问题
    )

    private var currentQuestionIndex = 0 // 当前展示的题目索引

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_quiz)

        // 初始化控件
        tvQuestion = findViewById(R.id.tv_question)
        rgOptions = findViewById(R.id.rg_options)
        btnNext = findViewById(R.id.btn_next)

        // 加载第一道题
        loadCurrentQuestion()

        // 下一题按钮点击事件
        btnNext.setOnClickListener {
            // 检查用户是否选中了选项
            val selectedOptionId = rgOptions.checkedRadioButtonId
            if (selectedOptionId == -1) {
                Toast.makeText(this, "请先选择一个选项哦", Toast.LENGTH_SHORT).show()
                return@setOnClickListener
            }

            // 切换到下一题
            currentQuestionIndex++
            if (currentQuestionIndex < questions.size) {
                loadCurrentQuestion()
            } else {
                // 所有题目完成,这里可以跳转到结果页或者直接结束
                Toast.makeText(this, "答题完成!太棒了🎉", Toast.LENGTH_LONG).show()
                finish()
            }
        }
    }

    // 加载当前题目到UI
    private fun loadCurrentQuestion() {
        // 清空之前的选项
        rgOptions.removeAllViews()
        // 获取当前题目
        val currentQuestion = questions[currentQuestionIndex]
        // 更新题目文本
        tvQuestion.text = currentQuestion.questionText
        // 动态添加选项到RadioGroup
        currentQuestion.options.forEachIndexed { index, optionText ->
            val radioButton = RadioButton(this).apply {
                text = optionText
                id = View.generateViewId() // 生成唯一ID
            }
            rgOptions.addView(radioButton)
        }
        // 取消之前的选中状态
        rgOptions.clearCheck()
    }
}

关于1000道题的疑问

完全不需要创建1000个Activity!你只需要把1000道题的数据存储在外部源(比如assets目录下的JSON文件、Room数据库或者后端接口),然后在APP启动时加载这些数据到列表中,用上面的方案动态展示即可。这样不仅代码简洁,后续修改、添加题目也只需要更新数据源,不用动代码,维护成本极低。

内容的提问来源于stack exchange,提问作者RGS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:07:53