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

Android Studio:如何实现按钮点击视图变更及动态生成n个答题界面

问题1:如何创建可在用户点击按钮后变更视图内容的Activity?

核心思路是在同一个Activity内通过控制视图的显示/隐藏,或者替换布局内容来实现,不用新建多个Activity。以下是两种简单可行的方案:

  • 方案一:直接控制视图显隐

    1. 在布局文件(如activity_main.xml)中添加需要切换的多个视图块,以及触发切换的按钮。比如用FrameLayout包裹两个不同的内容视图:
      <FrameLayout
          android:layout_width="match_parent"
          android:layout_height="match_parent">
          <TextView
              android:id="@+id/view1"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="初始视图内容"/>
          <TextView
              android:id="@+id/view2"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="点击按钮后的视图内容"
              android:visibility="gone"/>
      </FrameLayout>
      <Button
          android:id="@+id/switch_btn"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="切换视图"/>
      
    2. 在Activity代码中绑定按钮和视图,添加点击监听切换显隐状态:
      Kotlin示例:
      val switchBtn = findViewById<Button>(R.id.switch_btn)
      val view1 = findViewById<TextView>(R.id.view1)
      val view2 = findViewById<TextView>(R.id.view2)
      
      switchBtn.setOnClickListener {
          if (view1.isVisible) {
              view1.visibility = View.GONE
              view2.visibility = View.VISIBLE
          } else {
              view1.visibility = View.VISIBLE
              view2.visibility = View.GONE
          }
      }
      
      Java示例:
      Button switchBtn = findViewById(R.id.switch_btn);
      TextView view1 = findViewById(R.id.view1);
      TextView view2 = findViewById(R.id.view2);
      
      switchBtn.setOnClickListener(v -> {
          if (view1.getVisibility() == View.VISIBLE) {
              view1.setVisibility(View.GONE);
              view2.setVisibility(View.VISIBLE);
          } else {
              view1.setVisibility(View.VISIBLE);
              view2.setVisibility(View.GONE);
          }
      });
      
  • 方案二:使用ViewSwitcher(带切换动画)

    1. 布局中用ViewSwitcher包裹两个子视图,系统自带切换动画:
      <ViewSwitcher
          android:id="@+id/view_switcher"
          android:layout_width="match_parent"
          android:layout_height="match_parent">
          <TextView
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="第一个视图"/>
          <TextView
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="第二个视图"/>
      </ViewSwitcher>
      <Button
          android:id="@+id/switch_btn"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="切换"/>
      
    2. 代码中调用showNext()/showPrevious()切换:
      val switcher = findViewById<ViewSwitcher>(R.id.view_switcher)
      switchBtn.setOnClickListener {
          switcher.showNext()
      }
      
问题2:答题应用动态生成n个答题界面的最佳方案

你的暴力解法完全没必要,最佳方案是只用一个答题Activity,通过传递当前题目索引和总题数来动态更新内容,具体步骤如下:

  1. 定义题目数据结构
    先创建一个存储题目的实体类,包含题目内容、选项、正确答案:
    Kotlin示例:

    data class Question(
        val text: String,
        val options: List<String>,
        val correctAnswer: String
    )
    

    Java示例:

    public class Question {
        private String text;
        private List<String> options;
        private String correctAnswer;
    
        public Question(String text, List<String> options, String correctAnswer) {
            this.text = text;
            this.options = options;
            this.correctAnswer = correctAnswer;
        }
    
        // 生成getter方法
        public String getText() { return text; }
        public List<String> getOptions() { return options; }
        public String getCorrectAnswer() { return correctAnswer; }
    }
    
  2. 选择题目数量的Activity传参
    用户选择n后,通过Intent把总题数传递给答题Activity:

    // 选择数量页面的确认按钮点击事件
    val selectedCount = // 获取用户选择的n值(比如从Spinner/EditText中取)
    val intent = Intent(this, QuizActivity::class.java)
    intent.putExtra("TOTAL_QUESTIONS", selectedCount)
    startActivity(intent)
    
  3. 答题Activity动态加载题目
    这个Activity是通用的,负责显示当前题目、记录答案、切换题目,最后计算得分:

    • 布局包含题目文本、选项组(如RadioGroup)、底部按钮
    • 核心逻辑:
      class QuizActivity : AppCompatActivity() {
          private lateinit var questionText: TextView
          private lateinit var optionsGroup: RadioGroup
          private lateinit var actionBtn: Button
          private var currentIndex = 0
          private var totalQuestions = 0
          private var score = 0
          private lateinit var questions: List<Question>
      
          override fun onCreate(savedInstanceState: Bundle?) {
              super.onCreate(savedInstanceState)
              setContentView(R.layout.activity_quiz)
      
              // 获取传递的总题数
              totalQuestions = intent.getIntExtra("TOTAL_QUESTIONS", 0)
              // 生成对应数量的题目(也可以从本地/网络加载)
              questions = generateQuestions(totalQuestions)
      
              // 绑定视图
              questionText = findViewById(R.id.question_text)
              optionsGroup = findViewById(R.id.options_group)
              actionBtn = findViewById(R.id.action_btn)
      
              // 初始化显示第一题
              updateCurrentQuestion()
      
              // 按钮点击逻辑
              actionBtn.setOnClickListener {
                  val selectedOptionId = optionsGroup.checkedRadioButtonId
                  if (selectedOptionId != -1) {
                      // 判断当前答案是否正确
                      val selectedAnswer = findViewById<RadioButton>(selectedOptionId).text.toString()
                      if (selectedAnswer == questions[currentIndex].correctAnswer) {
                          score++
                      }
      
                      // 处理下一题或完成答题
                      if (currentIndex == totalQuestions - 1) {
                          // 跳转到结果页面
                          val resultIntent = Intent(this, ResultActivity::class.java)
                          resultIntent.putExtra("SCORE", score)
                          resultIntent.putExtra("TOTAL", totalQuestions)
                          startActivity(resultIntent)
                          finish()
                      } else {
                          currentIndex++
                          updateCurrentQuestion()
                      }
                  }
              }
          }
      
          // 更新当前题目的UI
          private fun updateCurrentQuestion() {
              val question = questions[currentIndex]
              questionText.text = question.text
      
              // 清空旧选项,添加新选项
              optionsGroup.removeAllViews()
              question.options.forEach { option ->
                  val radioBtn = RadioButton(this)
                  radioBtn.text = option
                  optionsGroup.addView(radioBtn)
              }
      
              // 根据是否是最后一题修改按钮文本
              actionBtn.text = if (currentIndex == totalQuestions - 1) "完成" else "下一题"
              optionsGroup.clearCheck()
          }
      
          // 模拟生成题目(实际项目可替换为本地/网络加载)
          private fun generateQuestions(count: Int): List<Question> {
              val questionList = mutableListOf<Question>()
              repeat(count) { i ->
                  questionList.add(Question(
                      "第${i+1}题:2+${i+1}等于几?",
                      listOf("${i+3}", "${i+4}", "${i+5}", "${i+6}"),
                      "${i+3}"
                  ))
              }
              return questionList
          }
      }
      
  4. 结果页面显示得分
    接收答题Activity传递的得分和总题数,直接展示即可。

这个方案的优势:

  • 无需创建多个Activity,代码复用性极强,维护成本低
  • 动态控制按钮文本,完美解决你提到的“最后一题按钮显示错误”问题
  • 后续扩展功能(如计时、错题回顾)只需修改这一个答题Activity即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:55:18