ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Android计算器开发实战:从布局到表达式解析的完整指南

Android计算器开发实战:从布局到表达式解析的完整指南 简介面向K12阶段初学者的安卓期末大作业资料基于Android Studio开发简易计算器完整覆盖从界面搭建到功能实现的各个流程。布局层面用XML编写显示区以及数字按钮、运算符按钮并通过设置监听器完成点击响应核心计算逻辑单独封装成类采用栈机制处理运算符优先级能够正确完成连续运算并显示结果。适合正在学习移动开发基础、需要完成课程设计或期末项目的学生参考。压缩包共48个文件大小仅180KB主要包含Java源码、XML布局与资源文件、Gradle构建脚本、PNG图片资源、properties配置及gitignore等辅助文件目录结构简洁可快速导入开发环境运行。已有4326人学习使用。通过该项目可以掌握Android工程创建、界面控件使用、事件监听、计算逻辑封装等关键技能同时了解APK打包发布流程代码清晰可复用可作为期末作业实现与二次功能扩展的参考起点。开头为什么我推荐用计算器作为安卓期末大作业如果你正在为安卓期末大作业发愁又恰好搜到了“Android Studio 简易计算器”——那这个题目确实值得好好做。计算器项目是安卓开发里最经典的练手作业之一界面不复杂、逻辑能深能浅既有UI布局的功夫又有事件处理和异常处理的逻辑还能顺便秀一把表达式解析、手势适配、空指针防护这些加分项。不管你是刚学完Java基础、第一次接触Android Studio还是已经能写点简单页面但没做过完整app这个项目都能让你在期末评分里拿到一个看得过去的“完成度”。这篇博文不是教科书式的“从零到一”教学而是我复盘自己当年做这个作业、后来帮学弟学妹改代码过程中沉淀下来的一套完整思路需求怎么拆、布局怎么写更规范、表达式怎么解析不踩坑、乱按符号会不会崩、以及那些让新手崩溃的Gradle、SDK、模拟器、真机连接问题。看完你不仅能把作业交上去还能搞明白每一个点击背后到底是什么在运转。1. 项目需求与整体设计先把“计算器”拆成一个一个能评分的小功能1.1 核心需求解析期末评分看什么老师要的是一个能跑、能演示、代码能讲的安卓app。计算器的“基本操作”一般定义为0到9数字输入、小数点、加减乘除四则运算、等号计算结果、清除C和退格删除。有些老师会加括号有些会要求连续运算比如34×211有些干脆只要最简单的单步运算。我建议你先把功能拆成三层对应评分点基础层数字输入、单次运算输入两个数再点等号、小数点处理、清除/退格。提升层连续运算、多次点击等号、除以0的提示、表达式合法性校验。进阶层括号支持如果课程没禁止、仿系统计算器界面风格、按键震动或声音反馈、横竖屏适配。为什么要拆层因为期末作业的代码评委你老师会看代码是否“有结构”。你要是把所有点击事件都塞进一个onClick里注释还没有那即使功能全对他也不会给太高分。拆分层之后代码里自然会出现MainActivity负责界面、CalculatorEngine负责计算逻辑、ExpressionValidator负责校验这种“界面和逻辑分离”的设计在讲代码时能讲3分钟不冷场分数一下就上去了。1.2 技术选型Java还是Kotlin、XML布局还是Compose期末作业一般跟着课程走。你们课教的是Java XML就用Java别在期末临时学Kotlin如果课程本来就是Kotlin那就老老实实Kotlin。我见过太多学生因为“网上教程都用Kotlin”就硬切语言结果语法错误比项目逻辑错误还多完全没必要。布局这块我先说结论XML手写布局是期末作业的安全牌。虽然近几年Compose很火但老师改作业时最怕“我看不懂你的代码”XML布局文件结构直观几行代码就能解释清楚而且网上资源多、出问题好查。不过有两种情况可以考虑Compose一是老师明确要求用二是你对自己很有把握想展示新技术。否则别在期末给自己上对抗路。关于计算逻辑还有个大方向性选择用系统自带公式计算还是自己解析表达式如果只想做最简单的“两个数运算”那直接存FirstNumber、Operator、SecondNumber三个变量就行。但如果想做到“34×211”这种带优先级的连续运算就必须自己写表达式解析常见方案是后缀表达式 栈。后面我会把两种方案都详细展开你根据自己的时间决定做到哪一层。1.3 UI界面的功能分区与视觉层次设计计算器的界面看似简单但很能看出基本功。我用一张分区图来记忆每个区域对应一套职责显示区TextView为主显示当前输入、运算过程和结果建议用大号字体和右对齐。功能键区C清除、退格删除、以及加减乘除建议颜色区别于数字。数字键区0到9加上小数点采用3×4宫格。等号键单独占据一个显眼位置可以比其他按钮大一点。在实际布局上最常用也最稳妥的是GridLayout或者LinearLayout嵌套。我自己偏好GridLayout因为简单直接把按钮按行列排列就行不用写一堆嵌套。但如果你用的Android Studio版本很低建议用TableLayout或LinearLayout老项目兼容性更好。另一个细节是按钮的layout_weight。很多新手的按钮忽大忽小就是因为没有给每个按钮按比例设置权重。你要保证同行的按钮宽度一致、同列的按钮高度一致这样界面才不会“乱奔”。当时我为了这个还查了半天后来总结出一个小口诀先把按钮的width设为0dp再用layout_weight1来均分记住这个就稳了。2. Android Studio环境准备与项目搭建2.1 下载安装Android Studio官方渠道与版本选择很多人在第一步就卡住——下载Android Studio。我建议直接去官网别从乱七八糟的下载站拿“绿色版”“汉化版”那种东西会有各种暗坑。官网下载时优先选稳定版不要追求最新预览版期末做作业稳定压倒一切。下载和安装本身不难难点一般出在两处。一是SDK路径。Windows上默认在C:\Users\你的用户名\AppData\Local\Android\Sdk这个路径里最好不要有中文否则很多工具会认不出。我第一次装的时候用户名就是中文后来发现一堆莫名其妙的报错最后只能重装系统并新建英文路径账户才解决。如果你已经有中文路径了也不必立刻重装可以先试试环境变量里的ANDROID_HOME指定到一个英文路径把SDK拷过去。二是Gradle首次下载很慢。Gradle是安卓项目的构建工具Android Studio新建项目时会自动下载对应版本的Gradle这一步在网络不太好的环境里可能要等很久而且进度条不走的时候特别让人焦虑。我常用的解决办法是先手动下好Gradle压缩包放到项目的gradle/wrapper指定的目录里或者通过镜像站下载然后手动替换这样能省掉一半等待时间。具体可以看本文第4章的“Gradle下载慢”问题条目。2.2 新建项目的“最低必要配置”打开Android Studio后选“New Project”模板选“Empty Views Activity”老版本叫“Empty Activity”。这里注意一个坑Empty Activity会默认生成一个叫ActivityMainBinding或对应的视图绑定类如果你不熟绑定可以选最普通的“Add No Activity”或者直接使用dev默认的模板。对期末来说选一个不生成绑定类的简单模板会更省心因为不用处理奇怪的新语法。项目建好之后你会看到一个标准的工程目录。关键文件只有几个MainActivity.java或MainActivity.kt主界面和逻辑入口。activity_main.xml布局文件。AndroidManifest.xml声明App的基础信息比如包名、入口Activity。build.gradleV版本和依赖配置一般不用改。第一次打开工程时Android Studio会做一次Gradle同步Sync这个同步会下载依赖库。如果你的网速一般建议给Android Studio配置代理或者直接连接稳定网络。这里我不展开代理配置只说结论同步失败9成是网络剩下1成是版本不匹配可以先看看右下角的“Build”窗口报什么错。2.3 在真机或者模拟器上跑起来的方式作业写完之后总要运行演示。模拟器跑起来最简单——Android Studio自带AVDAndroid虚拟设备管理器你只需要创建一个虚拟设备镜像比如Pixel 4 API 30或API 34的系统镜像启动模拟器点“Run”。第一次启动模拟器会很慢因为要加载系统镜像等一分钟以上是正常的。如果说模拟器起不来效果太卡或者空间不足那你需要真机调试。我用过比较多的是小米、华为、三星手机其实流程都是类似的手机打开开发者选项开启USB调试用数据线连接电脑手机上弹窗选“允许USB调试”然后Android Studio识别到设备后点Run。需要特别提醒的是华为和小米部分机型默认关闭了“USB安装”需要手动开启不然安装时会报“INSTALL_FAILED_USER_RESTRICTED”。真机连接最常遇到的坑是adb识别不到设备我在第4章会具体讲怎么排查。总之先确保模拟器和真机都能跑通一个空项目再开始写计算器逻辑这样后面排错时思路不会被环境问题干扰。3. 计算器界面实现与资源管理3.1 布局文件设计与按钮资源的使用计算器界面我最终是这么安排的顶部一个大的显示区域TextView下面按“C、退格、除、乘”排列第一行第二行是“7、8、9、减”第三行是“4、5、6、加”第四行是“1、2、3、等号”最后一行是“0、小数点、等号如果上面没放”。其中“0”可以横跨两列等号竖着占两行这样视觉上就很有计算器的感觉。布局的推荐写法是GridLayout指定行数和列数按钮按顺序添加。如果你用LinearLayout嵌套也要注意weight的均匀分配不然在窄屏手机上就会挤得很难看。每个按钮的样式除了背景颜色还需要加圆角和点击反馈。我通常用shape资源文件来定义按钮的背景这样比直接用android:background#FF9800好得多。比如shape xmlns:androidhttp://schemas.android.com/apk/res/android solid android:color#FF9800/ corners android:radius8dp/ /shape这样按钮圆角一致界面更像系统计算器。另外给按钮设置android:stateListAnimator或Selector可以实现按下去颜色变深的效果这个细节能让作业“看起来高级”。3.2 在MainActivity里绑定视图的常用方式界面写好了接下来就是把代码和XML“接上线”。这一步有几种方式我直接给结论如果要快速完成作业用传统的findViewById最简单虽然代码多但直观每一行都能看懂。Button btn1 findViewById(R.id.btn1); btn1.setOnClickListener(v - onNumberClick(1));如果用了ViewBinding需要用ActivityMainBinding来绑定代码会简洁一点但是模板生成可能引入额外问题建议在理解了findViewById之后再尝试。期末阶段用findViewById足够。重点是不要让几百行监听器堆在onCreate里。你可以写一个initViews()方法专门找控件initListeners()方法专门给控件挂监听器这样代码结构清晰期末答辩时讲起来也舒服。这也是我最想强调的点老师看代码不只是看功能更看“可读性”。3.3 样式与适配横竖屏和不同分辨率计算器作业看似不要求适配但如果你能考虑横竖屏那基本就是加分项了。最简单的方式是在res目录下新建layout-land文件夹再放一套横屏的activity_main.xml。横屏时计算器按键可以变稀疏、显示区变大不会因为屏幕变宽就把按钮拉得不成样。另外一种做法是锁定竖屏不搞适配。在AndroidManifest.xml的activity android:name.MainActivity android:screenOrientationportrait /里加一行就行。虽然简单粗暴但对于依赖复杂状态、又没时间做状态保存的期末项目来说锁竖屏是保住分数的一个重要手段。毕竟旋转屏幕时Activity会销毁重建如果不处理状态保存用户算到一半转个手机数字全没了演示时特别尴尬。锁竖屏能避免这个问题。再说字体。显示区的TextView建议用textSize48sp左右并设置maxLines1和ellipsizestart这样当表达式很长时自动从头部截断保证正在输入的数字始终露在最右边。很多人的计算器显示框是自动换行的看起来完全不像计算器这个细节要注意。4. 核心逻辑实现与踩坑实录4.1 最简单的实现方案双操作数单步运算如果你的需求只要求“两个数做一次运算”逻辑非常简单用字符串currentInput记录当前输入的数字用double firstNumber保存第一个数用String operator保存运算符。点击数字和小数点时追加到currentInput。点击运算符时把当前currentInput转为Double存到firstNumber清空currentInput记录运算符。点击等号时把当前currentInput转为Double作为secondNumber用switch判断运算符计算结果显示在TextView。这里最容易翻车的坑有两个一个是连续点击运算符时旧运算符被覆盖一个是按等号时currentInput为空导致崩溃。处理办法也很简单按运算符之前先判断currentInput是否为空为空就只替换运算符不保存数字按等号之前判断firstNumber和operator是否有效无效就直接返回。这种方案只能完成基本要求但当你在演示时输入34×2它会老老实实先算34再乘2结果是14而不是11懂行的老师一眼就能看出你没做优先级。所以如果你有余力请往下看后缀表达式方案。4.2 进阶方案表达式实时计算与后缀表达式解析想让计算器支持“表达式连续输入并正确处理优先级”就不能再按“三变量”的思路走而是要整体解析表达式。我用的是最成熟的后缀表达式逆波兰算法具体分两步第一步把中缀表达式转后缀。扫描字符串中的每个字符遇到数字和小数点收集成一个完整的数遇到运算符则从栈里弹出优先级不低于当前运算符的运算符直到栈顶优先级更低或遇到左括号当前运算符再入栈遇到左括号直接入栈遇到右括号则把栈里到左括号为止的运算符全部弹出。转换完成后把栈里剩余的运算符全部弹出。第二步计算后缀表达式。从左到右扫描遇到数字入栈遇到运算符就弹出两个数字计算再把结果入栈。扫描完成后栈里只剩下一个数就是结果。这个算法是数据结构课的经典内容你只要能写出这两个函数讲代码时完全能撑起“算法设计”这块评分点。转后缀的Java代码大致长这样private ListString infixToPostfix(String expression) { ListString output new ArrayList(); DequeCharacter stack new ArrayDeque(); int i 0; while (i expression.length()) { char ch expression.charAt(i); if (Character.isDigit(ch) || ch .) { StringBuilder sb new StringBuilder(); while (i expression.length() (Character.isDigit(expression.charAt(i)) || expression.charAt(i) .)) { sb.append(expression.charAt(i)); i; } output.add(sb.toString()); continue; } if (ch () { stack.push(ch); } else if (ch )) { while (!stack.isEmpty() stack.peek() ! () { output.add(String.valueOf(stack.pop())); } stack.pop(); } else if (isOperator(ch)) { while (!stack.isEmpty() precedence(stack.peek()) precedence(ch)) { output.add(String.valueOf(stack.pop())); } stack.push(ch); } i; } while (!stack.isEmpty()) { output.add(String.valueOf(stack.pop())); } return output; }等号触发的计算逻辑就是先把表达式拆成Token列表转后缀再计算。整个过程中还要处理“连续运算符覆盖”“括号不匹配”“除以0”等异常场景这些异常处理本身就是进阶知识点写好了也是加分项。4.3 异常处理与边界情况除零、连续符号、空输入期末演示最怕什么最怕你点了一个按钮程序直接崩溃弹窗。我总结下来计算器最容易崩溃的4个场景是连续输入运算符比如输入34如果不处理就会解析报错。处理方式是在添加运算符时判断当前输入串末尾是否已经是运算符如果是就替换而非追加。用户点等号时屏幕什么都没有。处理方式是在计算前判断表达式字符串是否为空。除数为0。注意不要只判断“数字是否等于0”因为0.0、0.00都是0。double判断0可以用Math.abs(value) 1e-10。括号不匹配。处理方式有两种一种是在转后缀过程中遇到右括号但栈里没有左括号时直接抛异常另一种是在等号计算前做个左括号数量校验。对期末项目来说写一个简单的isBalanced()方法就够了。一个很重要的经验把异常提示写到界面上而不是弹Toast。比如在显示区直接显示“错误”或“不能除以0”比弹一个Toast更直观也更容易让老师记住你做了异常处理。我在代码里一般是把try块包住整个计算过程catch里统一处理为显示错误信息这样代码既短又稳。try { double result evaluate(expression); display.setText(formatNumber(result)); } catch (ArithmeticException e) { display.setText(除数不能为0); } catch (Exception e) { display.setText(表达式有误); }4.4 Gradle下载慢、同步失败、ADB识别不到设备的排查跑项目的过程中最劝退的就是构建工具问题。我把最常见的几个拿出来单独说Gradle下载慢。打开项目的gradle/wrapper/gradle-wrapper.properties里面有distributionUrl可以看到Gradle版本。你可以手动到这个地址下载对应版本的zip包放到你自己指定的Gradle本地路径或者在build.gradle里更换仓库源。注意改仓库源时只需在项目级settings.gradle里的pluginManagement和dependencyResolutionManagement中把google()和mavenCentral()前面加上你网络可达的仓库即可。Gradle同步失败。报错信息如果提示“Could not find com.android.tools.build:gradle:7.x.x”说明插件没下载成功先检查网络。如果提示“SDK location not found”去local.properties文件里检查sdk.dir是否正确如果不存在就手动加一行sdk.dirC\:\\Users\\你的用户名\\AppData\\Local\\Android\\Sdk。ADB识别不到设备。先在命令行输入adb devices看看有没有设备。如果显示unauthorized拔掉手机重新插并在手机上重新勾选允许USB调试如果什么都不显示多半是没装手机厂商的USB驱动去手机官网下载驱动或者在Android Studio的SDK Manager里安装Google USB Driver。这些问题的通病是你不知道问题出在哪一环节所以排查顺序很重要先看Android Studio右下角Build窗口报什么错再逐行搜报错信息别自己瞎改配置。4.5 实用调试技巧与代码管理写完基本功能一定要自己“疯狂乱点”测试。期末作业最常见的翻车就是测试不充分一上去演示就崩。我的测试方法是先按正常流程点1 2 3。再按极端流程点连按十个数字、连续点多个运算符、按等号后再按数字、按C之后再按等号。再测试异常除以0、输入3.3.3、输入12)。每一项都不能崩。为了快速定位你可以在关键方法里加Log.d(Calculator, 当前表达式: expression)然后用Logcat查看输出。这个方法虽然土但期末调试绝对够用。源码管理也值得一提。你要是拖到最后一个晚上才写千万别只放在桌面不备份。用Git或者直接压缩zip传到自己的网盘每次改完都备份一次。我见过太多人写到凌晨电脑突然蓝屏然后所有代码全没了的惨案实在是太伤了。5. 功能扩展与期末演示加分技巧5.1 五个能快速落地的加分功能如果你做完基础功能还有时间可以从这几个扩展里选两三个加上显示历史表达式把表达式和结果拼成一段新文本保留在显示区上方这个改动很小。按键震动和音效用Vibrator加震用SoundPool播简短按键声前提是得准备一个小音频资源不能随便从网上下载不明文件。百分比和正负号加一个%键把当前值除以100加一个/-键把当前值乘以-1。逻辑简单但能显得功能丰富。键盘输入支持让手机实体键盘的输入也能控制计算器这个用onKeyDown就能做。深色主题在res/values-night里放一份颜色资源支持暗色模式系统深色模式下自动切换界面会显得比普通作业高级很多。扩展这些东西一定要控制在自己能讲明白的范围内别只为了加而加。老师验收时会问你“这个怎么实现的”你要是说不出来反而会扣印象分。5.2 答辩展示时的演示动线与话术思路期末作业通常要现场演示我建议你提前规划好演示动线别一上来就乱点。我的习惯是先演示正常流程12 34 46。再演示连续运算比如2 3 × 4 14强调代码支持四则运算优先级。再专门演示一个除法比如10 ÷ 0屏幕显示“除数不能为0”强调自己做过程序稳定性。最后展示一个UI细节比如长按退格键快速删除或者旋转屏幕如果做了适配时数据不丢失。提前把这段流程在模拟器里完整跑一遍确认每一个步骤、每一个数字都没问题演示的时候就不用慌。遇到老师反映“这个计算器好像没有系统的好用”你可以从容回答“简易计算器的核心目标是展示事件处理、表达式解析和异常处理后续可以继续优化。”5.3 这个项目之后还能怎么扩展计算器做完别急着删它是很好的扩展基础。我整理过几个后续方向改成支持科学计算加sin、cos、log、乘方复用现有的解析框架。改成符合Material Design的现代App引入Material Components改用CardView包裹按钮字体和间距统一看起来就是另一种质感。加单元测试用JUnit对CalculatorEngine写测试方法测试evaluate(34*2)11这种用例。这一点在课程要求“测试”时特别好使。扩展方向不在期末必须做但如果你想在个人简历上多个项目这段经历能直接长成一个“多功能计算器App”。结语从另一个角度说说我的体会这个项目看着简单但它其实串联了安卓开发的很多基本功布局的权重、事件监听、状态管理、字符串解析、异常处理、adb调试。如果你认认真真做一遍而不是从网上找代码直接下载等答辩那天你会发现你能跟老师讲清楚每一个按钮背后的逻辑链条。这比你多交两个华而不实的组件更能说明问题。最后再分享一个我当年答辩的教训一定要提前把手机或模拟器的息屏时间调长别讲到一半屏幕黑了。还有最好准备一张纸上面白纸黑字写出你的测试用例演示时照着走。当时我就是临时想起要演示连续运算手一抖点错了数字结果为了圆场只能重新算虽然最后分数还行但那一幕真的尴尬到现在。希望你们能避开这个坑。本文还有配套的精品资源点击获取
返回列表