Android开发:EditText满足条件时如何在TextView显示对应等级
优化方案
你当前的写法有两个核心问题:
- 浮点数直接用
==做等值判断存在精度误差风险,且实际成绩等级是按分数区间匹配,不是仅匹配固定几个孤立分值,比如用户输入3.99你现在的逻辑就识别不出A+ - 每个输入框单独写判断逻辑属于重复代码,后续扩展字段、加等级档位时代码量会线性暴涨,维护成本极高
优化只需要做三步:
- 把「分数转对应等级」的逻辑抽成全局通用方法,所有输入框统一复用,不管多少个科目都只写一次匹配规则
- 用「区间遍历匹配」代替零散的if等值判断,后续增减等级档位只需要修改规则列表,不需要改业务逻辑
- 把输入框、对应结果TextView做成配对列表统一处理,新增科目只需要往列表加一组控件配对,不用重复写取值、赋值代码
优化后代码
Activity逻辑代码如下:
//import 部分保持原有即可,需要额外导入 android.util.Pair public class MainActivity2 extends AppCompatActivity { // 等级匹配规则:按分数从高到低排列,每条记录是档位最低分+对应等级 // 后续要加/改等级,只需要改这个数组就行,比如加B、B-之类的直接往下加条目 private static final Object[][] GRADE_RULES = { {4.0, "A+"}, {3.7, "A"}, {3.3, "A-"}, {3.0, "B+"}, {2.7, "B"}, {2.3, "B-"} // 要加C、D、F等级直接按格式往下补即可 }; // 用列表存<输入框, 对应结果TextView>的配对,后续加科目直接往列表加配对 private List<Pair<EditText, TextView>> gradeViewPairs; private Button show_grade, resetButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); // 初始化控件配对,以后加S3/tv3、S4/tv4...直接在这加一行就行 gradeViewPairs = new ArrayList<>(); gradeViewPairs.add(new Pair<>(findViewById(R.id.S1), findViewById(R.id.tv))); gradeViewPairs.add(new Pair<>(findViewById(R.id.S2), findViewById(R.id.tv2))); show_grade = findViewById(R.id.show_grade); resetButton = findViewById(R.id.resetButton); show_grade.setOnClickListener(view -> { // 遍历所有配对,统一处理取值、转等级、赋值,不用每个控件写一遍 for (Pair<EditText, TextView> pair : gradeViewPairs) { EditText inputEt = pair.first; TextView resultTv = pair.second; String inputStr = inputEt.getText().toString().trim(); // 空值校验,避免用户没输入的时候parseDouble崩溃 if (inputStr.isEmpty()) { resultTv.setText(""); continue; } try { double score = Double.parseDouble(inputStr); resultTv.setText(getGradeByScore(score)); } catch (NumberFormatException e) { resultTv.setText("无效"); } } }); resetButton.setOnClickListener(view -> { // 重置也统一遍历处理,加多少科目都不用改这的逻辑 for (Pair<EditText, TextView> pair : gradeViewPairs) { pair.first.setText(""); pair.second.setText(""); } }); } /** * 通用分数转等级方法,所有场景都能复用 */ private String getGradeByScore(double score) { // 超过满分4.0也按A+算,低于最低档就返回F if (score >= 4.0) return "A+"; for (Object[] rule : GRADE_RULES) { double minScore = (double) rule[0]; String grade = (String) rule[1]; if (score >= minScore) { return grade; } } return "F"; } }
注:如果不想用SDK自带的
Pair类,也可以自己写个简单的实体类持有输入框、结果TextView两个控件,逻辑完全一致。
后续扩展说明
- 要加成绩档位:直接修改
GRADE_RULES数组,按「档位最低分数, 等级名称」的格式加条目即可,不需要动其他逻辑 - 要加科目输入框:先在XML布局里加对应的EditText和TextView,再在
gradeViewPairs初始化的地方加一行配对代码,不需要写额外的判断逻辑 - 你之前预估的8个字段、12个等级需要写96条if的场景,用这个写法核心逻辑代码不超过30行,且后续改规则只需要改一处,不会出现漏改问题
额外提醒:你当前XML布局里S2的hint写的是
@string/S1,属于复制后的笔误,建议改成对应科目的hint值,避免显示错误。
内容的提问来源于stack exchange,提问作者Mojahidul Islam Emon
相关产品推荐
相关产品推荐

