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

基于Enum与Switch实现测验题型(单选/多选/文本输入)显示切换

用Enum+Switch实现测验应用的题型控件切换

嘿,这个思路非常靠谱!用Enum统一管理题型,既能避免硬编码的魔法值,还能让代码的可读性和扩展性大大提升。我先帮你修正Question类里的小问题,再一步步展示怎么在Activity里实现控件的显示控制~

第一步:修正并完善Question类

你给出的代码里有几个语法和设计上的小问题,比如字段名的引号、Enum的访问权限,还有构造方法的完整性,调整后的版本如下:

public class Question {
    // 去掉字段名的引号(这是语法错误)
    private String question;
    private String option1;
    private String option2;
    private String option3;
    // 适配不同题型的答案存储
    private int singleAnswerNumber; // 单选题正确选项序号
    private List<String> correctAnswers; // 多选题正确答案集合
    private String textAnswer; // 文本输入题正确答案

    // 将Enum设为public,让外部Activity可以访问;规范命名,首字母大写
    public enum QuestionType {
        RADIO, CHECKBOX, TEXTENTRY
    }

    private QuestionType type;

    // 空构造保留,方便序列化
    public Question() {}

    // 针对不同题型的重载构造方法
    // 单选题构造
    public Question(String question, String option1, String option2, String option3, int singleAnswerNumber) {
        this.question = question;
        this.option1 = option1;
        this.option2 = option2;
        this.option3 = option3;
        this.singleAnswerNumber = singleAnswerNumber;
        this.type = QuestionType.RADIO;
    }

    // 多选题构造
    public Question(String question, String option1, String option2, String option3, List<String> correctAnswers) {
        this.question = question;
        this.option1 = option1;
        this.option2 = option2;
        this.option3 = option3;
        this.correctAnswers = correctAnswers;
        this.type = QuestionType.CHECKBOX;
    }

    // 文本输入题构造
    public Question(String question, String textAnswer) {
        this.question = question;
        this.textAnswer = textAnswer;
        this.type = QuestionType.TEXTENTRY;
    }

    // 必须的getter方法,让Activity能获取题型
    public QuestionType getType() {
        return type;
    }

    // 其他字段的getter根据需求补充
    public String getQuestion() {
        return question;
    }

    public String getOption1() {
        return option1;
    }

    // ... 其他选项和答案的getter
}

第二步:在Activity中用Switch控制控件显示

首先在布局文件(比如activity_quiz.xml)中提前放好三种题型的控件,默认设置为隐藏(android:visibility="gone"):

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

<!-- 单选题控件 -->
<RadioGroup
    android:id="@+id/rg_single_choice"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:visibility="gone">
    <RadioButton android:id="@+id/rb_option1" android:layout_width="match_parent" android:layout_height="wrap_content"/>
    <RadioButton android:id="@+id/rb_option2" android:layout_width="match_parent" android:layout_height="wrap_content"/>
    <RadioButton android:id="@+id/rb_option3" android:layout_width="match_parent" android:layout_height="wrap_content"/>
</RadioGroup>

<!-- 多选题控件 -->
<LinearLayout
    android:id="@+id/ll_multi_choice"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:visibility="gone">
    <CheckBox android:id="@+id/cb_option1" android:layout_width="match_parent" android:layout_height="wrap_content"/>
    <CheckBox android:id="@+id/cb_option2" android:layout_width="match_parent" android:layout_height="wrap_content"/>
    <CheckBox android:id="@+id/cb_option3" android:layout_width="match_parent" android:layout_height="wrap_content"/>
</LinearLayout>

<!-- 文本输入题控件 -->
<EditText
    android:id="@+id/et_text_entry"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:visibility="gone"/>

然后在Activity中,获取Question对象后通过switch-case切换控件显示状态:

public class QuizActivity extends AppCompatActivity {
    private TextView tvQuestion;
    private RadioGroup rgSingleChoice;
    private LinearLayout llMultiChoice;
    private EditText etTextEntry;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_quiz);

        // 初始化控件
        initViews();

        // 模拟获取一个Question对象(实际可从题库、网络等渠道获取)
        Question currentQuestion = new Question("Android中Enum的核心作用是什么?", 
                "存储固定常量集合", "动态生成数据", "用于网络请求", 1);

        // 加载题目并切换对应控件
        loadQuestion(currentQuestion);
    }

    private void initViews() {
        tvQuestion = findViewById(R.id.tv_question);
        rgSingleChoice = findViewById(R.id.rg_single_choice);
        llMultiChoice = findViewById(R.id.ll_multi_choice);
        etTextEntry = findViewById(R.id.et_text_entry);
    }

    private void loadQuestion(Question question) {
        // 先隐藏所有题型控件,避免之前的状态残留
        hideAllQuestionViews();

        // 设置题目文本
        tvQuestion.setText(question.getQuestion());

        // 根据题型切换显示对应的控件
        switch (question.getType()) {
            case RADIO:
                rgSingleChoice.setVisibility(View.VISIBLE);
                // 填充单选题选项
                ((RadioButton) rgSingleChoice.getChildAt(0)).setText(question.getOption1());
                ((RadioButton) rgSingleChoice.getChildAt(1)).setText(question.getOption2());
                ((RadioButton) rgSingleChoice.getChildAt(2)).setText(question.getOption3());
                break;
            case CHECKBOX:
                llMultiChoice.setVisibility(View.VISIBLE);
                // 填充多选题选项
                ((CheckBox) llMultiChoice.getChildAt(0)).setText(question.getOption1());
                ((CheckBox) llMultiChoice.getChildAt(1)).setText(question.getOption2());
                ((CheckBox) llMultiChoice.getChildAt(2)).setText(question.getOption3());
                break;
            case TEXTENTRY:
                etTextEntry.setVisibility(View.VISIBLE);
                etTextEntry.setHint("请输入你的答案");
                break;
            default:
                tvQuestion.setText("未知题型,请检查数据");
                break;
        }
    }

    // 封装隐藏所有控件的方法,减少重复代码
    private void hideAllQuestionViews() {
        rgSingleChoice.setVisibility(View.GONE);
        llMultiChoice.setVisibility(View.GONE);
        etTextEntry.setVisibility(View.GONE);
    }
}

额外小建议

  • 如果选项数量不固定,建议用List<String>存储选项,然后在代码中动态生成RadioButton/CheckBox,适配更多题型场景
  • 可以把题型对应的控件填充逻辑封装成单独方法,让loadQuestion更简洁
  • 后续验证答案时,也要对应题型做不同处理:单选取选中的RadioButton,多选收集所有选中的CheckBox,文本输入取EditText内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:37:25