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

