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

Android开发:EditText满足条件时如何在TextView显示对应等级

优化方案

你当前的写法有两个核心问题:

  • 浮点数直接用==做等值判断存在精度误差风险,且实际成绩等级是按分数区间匹配,不是仅匹配固定几个孤立分值,比如用户输入3.99你现在的逻辑就识别不出A+
  • 每个输入框单独写判断逻辑属于重复代码,后续扩展字段、加等级档位时代码量会线性暴涨,维护成本极高

优化只需要做三步:

  1. 把「分数转对应等级」的逻辑抽成全局通用方法,所有输入框统一复用,不管多少个科目都只写一次匹配规则
  2. 用「区间遍历匹配」代替零散的if等值判断,后续增减等级档位只需要修改规则列表,不需要改业务逻辑
  3. 把输入框、对应结果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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 14:21:20