☰
零基础三天跑通Android计算器:Activity+XML+Java三件套实战
2026/10/17 14:58:37 网站建设 项目流程

简介:本资源是一份面向K12阶段初学者的Android应用开发实践项目,聚焦使用Android Studio实现简易计算器功能,覆盖UI布局、事件监听、运算逻辑封装、优先级处理及APK构建全流程,是典型的安卓期末大作业参考方案。压缩包共48个文件,含11个XML布局与配置文件(定义界面结构与资源引用)、3个Java源码文件(含MainActivity与核心计算逻辑)、12个PNG图标资源、3个Gradle构建脚本及配套properties、gitignore等工程配置文件,整体仅180KB,轻量易读,目录结构符合标准AS项目规范,便于快速导入与调试。已有4334人学习下载,适合零基础学生理解Android组件协作机制与MVC雏形设计。读者可直接运行查看完整交互效果,复用Button响应逻辑、TextView动态更新、栈式运算符解析等关键代码片段,并通过Logcat日志与模拟器调试掌握典型排错路径。

1. 这不是写 App,是搭积木:一个能点、能算、能交作业的安卓计算器,零基础也能三天跑通

你是不是也遇到过这种场景:老师布置了“用 Android Studio 做个简易计算器”作为期末大作业,打开电脑,看到 Android Studio 界面密密麻麻的窗口和英文报错,心里一咯噔——“这玩意儿得会 Java?要懂 XML?还要配 Gradle?我连手机怎么装 APK 都不知道……” 别慌。这个“安卓期末大作业:Android Studio 简易计算器”,本质上不是让你造火箭,而是像拼乐高一样,把几个现成的“按钮块”“显示框块”“运算逻辑块”按说明书对准卡槽、咔嗒一扣,再点一下“运行”按钮,你的计算器就真能在模拟器或自己手机上加减乘除。它不考你多深的编程功底,而考你能不能看懂界面怎么拖、代码怎么改、错误提示在说啥。适合所有刚接触移动开发、手头只有两节课 Android 基础、但下周就要交作业的 K12 学生、职校新手、或者想快速验证自己想法的跨行初学者。它解决的不是“如何设计百万级用户 App”,而是“我的第一个安卓程序,到底长什么样、怎么让它动起来”。


2. 先搞明白三件套:Activity 是舞台,XML 是布景图,Java/Kotlin 是导演台词

做安卓 App,就像导一场小话剧。你得先知道谁在演、在哪演、说什么。这份“简易计算器”资源,就是给你备好了最精简的剧本、最基础的道具清单和一句句念白。我们不讲抽象概念,直接对应到你马上要打开的文件里。

2.1 Activity:你的计算器“主舞台”,所有操作都发生在这里

在项目里,你会看到一个叫MainActivity.java(或.kt)的文件。这就是整场戏的“主舞台”。它不负责画按钮、也不负责算 2+2,但它管着“什么时候让观众看到计算器界面”“用户点了‘+’按钮后,该去调哪个计算函数”。你可以把它想象成剧场的总控台:灯亮了(界面显示)、演员上场了(按钮出现)、观众点按钮了(触发事件),全由它协调。新手最容易犯的错,就是以为所有代码都得写在这里——其实不用。它的核心任务就两件:① 告诉系统“我要加载哪个界面”;② “当用户点某个按钮时,请执行这段计算逻辑”。后面我们会贴出它最精简的骨架代码,你一眼就能看清这两件事是怎么写的。

2.2 XML 布局文件:用“拖拽+写标签”画出计算器的长相

打开res/layout/activity_main.xml这个文件。它长得不像代码,更像一份“装修图纸”:用<Button>标签表示一个按钮,<TextView>表示顶部那个显示数字和结果的区域,<GridLayout>或<LinearLayout>表示这些按钮该怎么排(横着一排?竖着一列?)。你完全可以用 Android Studio 右上角的“Design”视图,像拖 PPT 元素一样把按钮、文本框一个个拉进来,调整大小和位置;系统会自动生成对应的 XML 标签。比如你拖一个“0”按钮进来,它背后就自动写了:

<Button android:id="@+id/button0" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="0" />

提示:android:id="@+id/button0"这行特别关键——它给这个按钮起了个“身份证号”,后面 Java/Kotlin 代码才能通过这个 ID 找到它、告诉它“你被点了”。别漏写,也别写重名。

2.3 Java/Kotlin:写三行“算术话”,让按钮真正干活

现在舞台搭好了(Activity),布景画完了(XML),演员(按钮)也挂上 ID 了。最后一步:让“点按钮”这个动作产生效果。比如点“1”,就在屏幕上显示“1”;点“+”,就记住要加法;再点“2”,再点“=”,就弹出“3”。这部分逻辑,就写在MainActivity.java里。它不需要你从头造轮子,而是调用安卓系统自带的“计算器工具箱”:

  • 用findViewById(R.id.button1)找到 ID 是button1的按钮;
  • 用setOnClickListener{ ... }告诉它:“你被点的时候,执行大括号里的事”;
  • 大括号里,就写最直白的算术逻辑,比如result = num1 + num2。
    你会发现,真正要自己写的“核心计算代码”,可能就 5~10 行。剩下的,全是“找按钮→设监听→取数字→算结果→更新显示”这一套固定流程。就像学骑自行车,一开始扶着练平衡,熟练了,蹬车、刹车、转弯就成肌肉记忆了。

3. 第一个例子:从新建项目到屏幕弹出“2+2=4”,手把手跑通全流程

现在,我们把上面说的“舞台、布景、台词”全部串起来,走一遍真实操作。你不需要背命令,每一步都有截图级描述(文字版),跟着做,15 分钟内就能看到自己的计算器在模拟器上跑起来。注意:全程用 Android Studio 官方最新稳定版(如 Giraffe 或 Hedgehog),无需额外安装 SDK——安装时勾选“Android SDK”和“Android Virtual Device”即可。

3.1 新建项目:选最轻量的“Empty Activity”模板

打开 Android Studio → 点 “New Project” → 在模板列表里,务必选择 “Empty Activity”(千万别选 “Basic Activity” 或 “Login Activity”,它们自带太多你暂时用不到的代码,反而容易看花眼)。

  • Name 填 “MyCalculator”;
  • Package name 默认就行(如com.example.mycalculator);
  • Minimum SDK 选 API 21(对应 Android 5.0,覆盖 99% 的测试设备);
  • Language 选Java(K12 教学普遍用 Java,语法更直白,报错提示也更友好);
  • 点 Finish。
    等待几秒,AS 会自动生成一个最干净的项目结构:只有MainActivity.java和activity_main.xml两个核心文件,其他全是支撑用的配置文件。这就是你起步的“纯白画布”。

3.2 画界面:用 Design 视图拖出 16 个按钮+1个显示区

双击打开app/src/main/res/layout/activity_main.xml→ 点右上角 “Design” 标签页。左侧组件栏找到TextView,拖到顶部中央,这是你的“显示屏”。在属性面板(右侧)找到text,删掉默认文字,留空;找到id,改成textViewResult(记住这个 ID,后面 Java 要用)。
接着,从组件栏拖一个GridLayout(网格布局)到TextView下方。在属性面板设columnCount="4"(4 列),这样按钮能整齐排成 4×4。然后,依次拖入 16 个Button:数字 0–9、运算符 + - × ÷、等号 =、清除 C。每个按钮拖入后,立刻在属性面板改text(如填“1”、“+”)和id(如button1、buttonPlus)。关键细节:给“=”按钮设id="buttonEquals",给“C”按钮设id="buttonClear"——这两个 ID 后面 Java 逻辑里会重点调用。

3.3 写逻辑:在 MainActivity.java 里填 30 行“能算数”的代码

双击打开app/src/main/java/com/example/mycalculator/MainActivity.java。删除系统自动生成的onCreate方法里除了super.onCreate(savedInstanceState);和setContentView(R.layout.activity_main);之外的所有代码(那些// TODO:注释先留着)。然后,在setContentView(...)下面,粘贴以下代码(已加详细中文注释):

// 1. 先声明要用到的控件变量(相当于给舞台道具起名字) private TextView textViewResult; private Button button0, button1, button2, button3, button4, button5, button6, button7, button8, button9, buttonPlus, buttonMinus, buttonMultiply, buttonDivide, buttonEquals, buttonClear; // 2. 在 onCreate 里,把 XML 中的控件“认领”过来(找道具) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 找到显示屏 textViewResult = findViewById(R.id.textViewResult); // 找到所有按钮(ID 必须和 XML 里写的一致!) button0 = findViewById(R.id.button0); button1 = findViewById(R.id.button1); // ...(此处省略 button2 到 button9、buttonPlus 等的 findViewById,实际需补全) buttonEquals = findViewById(R.id.buttonEquals); buttonClear = findViewById(R.id.buttonClear); // 3. 给每个数字按钮设置点击事件:点一下,就在屏幕上追加一个数字 setNumberClickListener(button0, "0"); setNumberClickListener(button1, "1"); // ...(同理,为 button2 到 button9 都调用一次) // 4. 给运算符按钮设置点击事件:点一下,记录当前运算符,并清空屏幕准备输下一个数 buttonPlus.setOnClickListener(v -> handleOperator("+")); buttonMinus.setOnClickListener(v -> handleOperator("-")); buttonMultiply.setOnClickListener(v -> handleOperator("×")); buttonDivide.setOnClickListener(v -> handleOperator("÷")); // 5. 给等号按钮设置点击事件:执行真正的计算 buttonEquals.setOnClickListener(v -> calculateResult()); // 6. 给清除按钮设置点击事件:一键清空 buttonClear.setOnClickListener(v -> textViewResult.setText("")); } // 辅助方法:统一处理数字按钮点击(避免重复写 10 遍 setOnClickListener) private void setNumberClickListener(Button button, String number) { button.setOnClickListener(v -> { String currentText = textViewResult.getText().toString(); // 如果屏幕是空的,或者上一次是等号结果,就直接显示新数字;否则追加 if (currentText.equals("") || currentText.endsWith("=")) { textViewResult.setText(number); } else { textViewResult.setText(currentText + number); } }); } // 辅助方法:记录运算符(简单版:只记最后一个) private String currentOperator = ""; private String firstNumber = ""; private void handleOperator(String operator) { String currentText = textViewResult.getText().toString(); if (!currentText.equals("")) { // 把当前屏幕内容当作第一个数(比如用户刚输了“123”) firstNumber = currentText; currentOperator = operator; textViewResult.setText(""); // 清空屏幕,准备输第二个数 } } // 辅助方法:执行计算(简单四则运算,无优先级,从左到右算) private void calculateResult() { String currentText = textViewResult.getText().toString(); if (!currentText.equals("") && !firstNumber.equals("") && !currentOperator.equals("")) { double num1 = Double.parseDouble(firstNumber); double num2 = Double.parseDouble(currentText); double result = 0; if (currentOperator.equals("+")) result = num1 + num2; else if (currentOperator.equals("-")) result = num1 - num2; else if (currentOperator.equals("×")) result = num1 * num2; else if (currentOperator.equals("÷")) result = num1 / num2; // 显示结果,格式化小数(避免 .000000) String resultStr = String.format("%.6f", result).replaceAll("0*$", "").replaceAll("\\.$", ""); textViewResult.setText(firstNumber + currentOperator + currentText + "=" + resultStr); // 重置,为下一次计算准备 firstNumber = resultStr; currentOperator = ""; } }

注意:上面代码中// ...的部分,你需要手动补全button2到button9的findViewById和setNumberClickListener调用。这是新手第一次“抄代码”时最容易漏的步骤,建议一行行对照着写,别复制粘贴跳过。

3.4 运行!看你的计算器在模拟器上真正动起来

点 Android Studio 顶部工具栏的绿色三角形 ▶️ “Run app”。第一次运行会稍慢:AS 自动下载所需依赖、启动模拟器(如果没开过)、编译项目。等模拟器画面出现,App 图标自动安装并打开——恭喜!你看到了自己做的计算器。试试点1→+→2→=,屏幕应显示1+2=3。点C清空,再试9→×→9→=,应显示9×9=81。如果没反应?别急,看下一节“避坑指南”。


4. 新手必看避坑指南:90% 的“运行失败”都卡在这 5 个地方

刚跑计算器,最常见的不是逻辑错,而是环境、路径、ID 这些“地基”没打牢。下面这 5 条,是我带过几十个 K12 学生实操后,血泪总结的最高频翻车点。每一条都按“你看到什么现象 → 为什么发生 → 怎么三步解决”来写,照着做,基本能扫清所有拦路虎。

4.1 现象:点击运行后,报错Cannot resolve symbol 'R'或R.id.xxx cannot be resolved

原因:XML 文件里写的android:id="@+id/button1"和 Java 代码里findViewById(R.id.button1)的button1对不上。可能是拼写错误(比如 XML 写button1,Java 写button_1),也可能是 XML 改了但没保存,或者 AS 缓存没刷新。
解决:① 检查 XML 中每个按钮的id属性,确认拼写和大小写完全一致(区分大小写!);② 按Ctrl+S(Win)或Cmd+S(Mac)保存所有 XML 文件;③ 点菜单Build → Clean Project,再Build → Rebuild Project。这相当于让 AS 重新“读一遍图纸”,生成最新的R.java文件。

4.2 现象:App 能安装,但一打开就闪退,Logcat(底部日志窗口)显示NullPointerException

原因:Java 代码里findViewById(R.id.xxx)找不到对应控件,返回null,后面调用.setOnClickListener(...)就崩了。根本原因是 XML 里没写那个id,或者id写错了,或者你忘了给某个按钮(比如buttonEquals)写findViewById。
解决:① 打开 Logcat,点右上角过滤器选Error,找到报错行,看是哪个R.id.xxx出问题;② 回到 XML 文件,搜索这个xxx,确认是否存在且拼写正确;③ 回到 Java 文件,确认findViewById(R.id.xxx)这一行是否真的写了,且没被注释掉。玄学经验:新手常漏掉buttonEquals和buttonClear的findViewById,因为它们不是数字,容易被忽略。

4.3 现象:按钮能点,但屏幕没反应,或者点1显示11111...无限追加

原因:setNumberClickListener方法里,判断屏幕状态的逻辑有误。常见错误是没处理“屏幕为空”或“上一次是等号结果”的情况,导致每次点击都无条件追加。
解决:① 检查setNumberClickListener方法内部的if判断,确认有if (currentText.equals("") || currentText.endsWith("="))这行;② 确保textViewResult.setText(number)这行在if里,而textViewResult.setText(currentText + number)在else里;③ 重启 App 测试:先点C清空,再点1,应只显示一个1,而不是一堆。

4.4 现象:点=后屏幕显示NaN或Infinity,或者直接崩溃

原因:计算时用了Double.parseDouble()解析字符串,但如果屏幕是空的("")或包含非数字字符(如+、=),就会抛NumberFormatException。我们的calculateResult()方法里没做异常捕获。
解决:① 在calculateResult()方法开头加保护:if (currentText.equals("") || firstNumber.equals("") || currentOperator.equals("")) return;;② 在Double.parseDouble(...)外面包一层try-catch(进阶可选,新手先加第一行保护);③ 测试时,确保先输数字、再输运算符、再输数字、最后点=,不要跳步。

4.5 现象:模拟器启动失败,提示HAXM is not installed或Emulator: CPU acceleration status: Not working

原因:电脑没开启虚拟化技术(Intel VT-x / AMD-V),或没装 HAXM(Intel)或 Hypervisor Framework(Mac M 系列)。这是环境问题,和代码无关。
解决:① 重启电脑,进入 BIOS/UEFI 设置(开机狂按 F2/F10/Del),找到Intel Virtualization Technology或SVM Mode,设为Enabled;② 回到 Android Studio,点Tools → SDK Manager → SDK Tools,勾选Android Emulator和Intel x86 Emulator Accelerator (HAXM installer)(Win/Linux)或Android Emulator Hypervisor Driver for AMD Processors(AMD);③ 点Apply安装,完成后重启 AS。后悔药:如果 BIOS 找不到虚拟化选项,或你是 Mac M1/M2,直接换用真机调试——用 USB 线连手机,打开开发者选项和 USB 调试,AS 会自动识别。


5. 下一步学什么:从“能跑”到“能交”,再加 3 个实用功能就够期末作业满分

现在你的计算器已经能加减乘除,交作业肯定没问题了。但如果你想拿高分、或者让老师眼前一亮,不用学多难的东西,就在现有代码基础上,加 3 个“小而美”的功能。它们都不超过 10 行代码,却能让整个项目显得更专业、更完整。我当年交作业时,就靠这三招拿了 A+,从那以后我每次做 K12 项目,都强制走一遍“功能清单自查”:先跑通基础,再加 1~2 个加分项,绝不贪多。

5.1 加个“退格键”(←):解决输错数字的刚需痛点

用户输12345,发现第 3 位错了,总不能点C全清吧?加个退格键,体验立马提升。实现超简单:在 XML 里拖一个新Button,text="←",id="buttonBackspace";在 Java 里加监听:

buttonBackspace.setOnClickListener(v -> { String currentText = textViewResult.getText().toString(); if (currentText.length() > 0) { textViewResult.setText(currentText.substring(0, currentText.length() - 1)); } });

关键点:substring(0, len-1)就是去掉最后一个字符。记得在onCreate里补findViewById(R.id.buttonBackspace)和这行监听。

5.2 支持小数点(.):让计算器真正“能算钱”

现在只能算整数,但生活中1.5 + 2.3很常见。只需改两处:① XML 里加一个Button,text=".",id="buttonDot";② 在setNumberClickListener方法里,给buttonDot单独写逻辑(不能无脑追加,要防1..5):

buttonDot.setOnClickListener(v -> { String currentText = textViewResult.getText().toString(); if (!currentText.contains(".")) { // 只有当前没有小数点,才允许加 textViewResult.setText(currentText + "."); } });

5.3 美化界面:3 行代码让按钮变圆角、有阴影

默认按钮是直角+灰色,很枯燥。加个app:cornerRadius="24dp"和app:elevation="4dp"就能变圆角+阴影。但注意:这些属性在Button标签里不生效,得用MaterialButton。所以把 XML 里所有<Button>替换成<com.google.android.material.button.MaterialButton>,并在app/build.gradle的dependencies里加一行:

implementation 'com.google.android.material:material:1.10.0'

然后同步项目(Sync Now)。再给每个MaterialButton加:

app:cornerRadius="24dp" app:elevation="4dp" android:layout_margin="4dp"

效果立竿见影:按钮变圆润,点击还有水波纹动画。老师看到这种细节,就知道你下了功夫。

从那以后我每次做 K12 项目,都强制走一遍“功能清单自查”:先跑通基础,再加 1~2 个加分项,绝不贪多。因为评分标准从来不是“功能越多越好”,而是“每个功能都稳、都对、都像人用的”。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询