如何在 Android 中安全计算勾选复选框对应的价格并汇总总费用

霞舞

霞舞

2026-07-05

719人浏览

原创

本文详解如何在 android 应用中正确实现复选框价格累加逻辑,避免因空输入、类型转换异常或 view 查找失败导致的崩溃(如跳回首页),并结合成人/儿童票数量动态计算总金额。

本文详解如何在 android 应用中正确实现复选框价格累加逻辑,避免因空输入、类型转换异常或 view 查找失败导致的崩溃(如跳回首页),并结合成人/儿童票数量动态计算总金额。

在 Android 开发中,通过复选框(CheckBox)动态叠加服务项价格(如 3D 升级、爆米花套餐等)是常见需求。但若未妥善处理用户输入与 UI 组件状态,极易引发 NumberFormatException 或 NullPointerException,导致应用意外重启(表现为“跳回首页”)。以下为完整、健壮的实现方案:

✅ 正确做法:安全解析 + 状态聚合 + 防错兜底

首先,不要在 calculateTDEE(View view) 中重复调用 findViewById()——该方法应在 onCreate() 中初始化一次,并使用 ViewBinding 或成员变量缓存引用(推荐 ViewBinding,更安全高效)。此处以兼容传统写法为例:

Android开发教程与笔记pdf版
Android开发教程与笔记pdf版

Android文件存取与数据库编程知识,文件操作主要是读文件、写文件、读取静态文件等,同时还介绍了创建添加文件内容并保存,打开文件并显示内容;数据库编程方面主要介绍了SQLite数据库的使用、包括创建、删除、打开数据库、非查询SQL操作指令、查询SQL指令-游标Cursors等知识。

下载
public class Movie1Activity extends AppCompatActivity {
    private CheckBox cb1, cb2, cb3;
    private EditText etAdult, etChild;
    private TextView tvResult;

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

        // 一次性初始化视图引用(避免多次 findViewById)
        cb1 = findViewById(R.id.cb1);
        cb2 = findViewById(R.id.cb2);
        cb3 = findViewById(R.id.cb3);
        etAdult = findViewById(R.id.etAdult);
        etChild = findViewById(R.id.etChild);
        tvResult = findViewById(R.id.tvResult);
    }

    public void calculateTDEE(View view) {
        // 1. 安全获取厅型(建议改用 RadioGroup + onCheckedChanged 更规范)
        String hall = "2D"; // 默认值
        RadioButton rb1 = findViewById(R.id.rb1);
        RadioButton rb2 = findViewById(R.id.rb2); // 假设 MX4D 对应 rb2
        if (rb2 != null && rb2.isChecked()) {
            hall = "MX4D";
        }

        // 2. 安全解析人数(含空值/非法输入兜底)
        int adult = safeParseInt(etAdult.getText().toString(), 0);
        int child = safeParseInt(etChild.getText().toString(), 0);

        // 3. 计算复选框附加费用(支持多选累加)
        double addonSum = 0.0;
        if (cb1.isChecked()) addonSum += 14.50;
        if (cb2.isChecked()) addonSum += 18.50;
        if (cb3.isChecked()) addonSum += 14.50;

        // 4. 计算基础票价并叠加附加费
        double basePrice;
        if ("2D".equals(hall)) {
            basePrice = 10.00 * child + 21.50 * adult;
        } else {
            basePrice = 18.00 * child + 30.50 * adult;
        }
        double totalPrice = basePrice + addonSum;

        // 5. 安全更新结果(格式化金额,避免小数位过长)
        tvResult.setText(String.format(
            "Your order is confirmed! Total: RM%.2f (Pay at Counter)", 
            totalPrice
        ));
    }

    // 工具方法:安全解析整数,失败时返回默认值
    private int safeParseInt(String input, int defaultValue) {
        if (input == null || input.trim().isEmpty()) return defaultValue;
        try {
            return Integer.parseInt(input.trim());
        } catch (NumberFormatException e) {
            return defaultValue;
        }
    }
}

⚠️ 关键注意事项

  • 禁止直接 parseInt() 无防护调用:EditText 可能为空、含空格或非数字字符,必须用 try-catch 或工具方法兜底。
  • findViewById() 返回 null 的风险:确保布局文件 activity_movie1.xml 中存在所有 ID,且拼写完全一致(区分大小写);建议启用 ViewBinding 替代 findViewById。
  • 复选框逻辑应为「累加」而非「覆盖」:原代码中 sum = 14.50 会覆盖前序值,正确做法是 += 累加。
  • View 参数未被使用:方法签名 calculateTDEE(View view) 中的 view 参数未被读取,若绑定到按钮点击事件则合理;若绑定到复选框,则需改用 CompoundButton.OnCheckedChangeListener 并移除 android:onClick 属性。
  • 日志排查优先:当出现“跳回首页”,99% 是未捕获异常导致 Activity 重建。务必查看 Logcat 中的 FATAL EXCEPTION 堆栈,定位具体崩溃行。

✅ 最佳实践延伸

  • 使用 RadioGroup 管理单选按钮,通过 radioGroup.getCheckedRadioButtonId() 获取选中项。
  • 对价格计算结果使用 String.format("RM%.2f", value) 保证货币显示精度。
  • 考虑将价格常量提取为 final static double 字段,提升可维护性。

遵循以上方案,即可稳定实现复选框价格动态计算,彻底规避崩溃与逻辑错误。

相关专题

更多
android开发三大框架
android开发三大框架

android开发三大框架是XUtil框架、volley框架、ImageLoader框架。本专题为大家提供android开发三大框架相关的各种文章、以及下载和课程。

2023.08.14

750

4

android是什么系统
android是什么系统

Android是一种功能强大、灵活可定制、应用丰富、多任务处理能力强、兼容性好、网络连接能力强的操作系统。本专题为大家提供android相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.22

2058

5

android权限限制怎么解开
android权限限制怎么解开

android权限限制可以使用Root权限、第三方权限管理应用程序、ADB命令和Xposed框架解开。详细介绍:1、Root权限,通过获取Root权限,用户可以解锁所有权限,并对系统进行自定义和修改;2、第三方权限管理应用程序,用户可以轻松地控制和管理应用程序的权限;3、ADB命令,用户可以在设备上执行各种操作,包括解锁权限;4、Xposed框架,用户可以在不修改系统文件的情况下修改应用程序的行为和权限。

2023.09.19

3275

7

android重启应用的方法有哪些
android重启应用的方法有哪些

android重启应用有通过Intent、PendingIntent、系统服务、Runtime等方法。本专题为大家提供Android相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

361

5

Android语音播放功能实现方法
Android语音播放功能实现方法

实现方法有使用MediaPlayer实现、使用SoundPool实现两种。可以根据具体的需求选择适合的方法进行实现。想了解更多语音播放的相关内容,可以阅读本专题下面的文章。

2024.03.01

693

5

墨刀AI提示词教学
墨刀AI提示词教学

本合集由PHP中文网精心整理,为您提供全面的墨刀AI提示词教学。内容涵盖高质量原型撰写公式与实操窍门,助您轻松掌握AI设计工具。无论是零基础入门还是进阶技巧,都能让您快速上手,大幅提升产品设计与协作效率。

2026.08.04

3

21

墨刀AI完整入门
墨刀AI完整入门

PHP中文网为您倾力打造墨刀AI保姆级入门指南完整版!本合集从零基础讲起,涵盖AI生成原型、提示词优化、图片转原型及多轮对话等核心功能。无论您是新手还是进阶用户,都能轻松掌握产品设计全流程。快来PHP中文网,一键解锁高效设计技巧,让想法即刻成型!

2026.08.04

1

20

墨刀AI进阶技巧
墨刀AI进阶技巧

本合集由PHP中文网精心整理,为您提供墨刀AI核心进阶策略指南。内容涵盖高效提示词写作、原型智能生成与微调、结构化导图制作及行业分析报告输出等实战技巧。助您轻松掌握AI设计工具,大幅提升产品设计与团队协作效率。

2026.08.04

4

14

火山引擎实名认证失败怎么办
火山引擎实名认证失败怎么办

火山引擎实名认证失败可能与证件信息填写错误、姓名或企业信息不一致、证件照片不清晰、营业执照状态异常、手机号验证失败或审核资料不完整有关。本专题整理个人认证、企业认证、资料上传、审核退回、重新提交和认证不通过的常见处理方法。

2026.08.04

3

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 39.4万人学习

Java 教程
Java 教程

共578课时 | 171.4万人学习

Uniapp从零开始实现新闻资讯应用
Uniapp从零开始实现新闻资讯应用

共64课时 | 8.6万人学习