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
相关产品推荐
相关产品推荐

