☰
安卓开发入门:从零搭建可运行计算器App
2026/10/16 14:59:14 网站建设 项目流程

简介:本资源是一份面向K12阶段初学者的Android开发实战项目,聚焦使用Android Studio实现简易计算器应用,覆盖界面设计、事件响应、运算逻辑与调试发布全流程,是典型的安卓期末大作业参考方案。压缩包共48个文件,含11个XML布局与配置文件(定义UI结构与资源引用)、3个Java核心源码文件(含MainActivity与计算逻辑)、12张PNG图标资源、3个Gradle构建脚本及7个properties配置文件,整体仅180KB,轻量易读,目录结构清晰体现标准AS工程组织方式。已有4334人学习下载,适合零基础学生快速上手Android开发,可直接导入Android Studio运行调试,配套完整可执行代码、规范命名的组件ID与注释清晰的onClick逻辑,尤其便于理解按钮监听机制、TextView动态更新及基础栈式运算符优先级处理思路。

1. 这不是写 App,是搭积木:一个能加减乘除的计算器,就是你安卓开发的第一块砖

你有没有试过点开手机里的计算器,突然好奇——“它到底怎么知道我按了‘5’又按了‘+’再按‘3’,最后就蹦出‘8’?”
别笑,这问题特别实在。它不考算法,不问底层,就问一件事:人点一下,屏幕变一个数,这个“点→变”的链条,是怎么连起来的?
这就是安卓开发最原始、最干净的入口:用 Android Studio 这个工具,把按钮(Button)、显示框(TextView)、运算逻辑(Java/Kotlin 代码)三样东西,像搭乐高一样卡进一个叫“Activity”的模板里。它不涉及登录、不连服务器、不调摄像头,但完整走通了“用户操作 → 界面响应 → 业务计算 → 结果呈现”这一整条安卓 App 的最小闭环。
适合谁?K12 阶段刚接触编程的中学生、职校生,或者大学里第一次打开 Android Studio 的大一新生——你不需要懂“进程”“Binder”“Handler”,甚至不用会 Java 全家桶;只要你能看懂a + b是加法,能分清“点一下”和“显示文字”是两件事,你就已经站在起点线上了。这份“简易计算器”资源,就是专为这个起点设计的:文件少、结构平、注释密、改一行就能看到效果。它不炫技,但每一步都踩在新手最容易理解的节奏上。


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

安卓 App 不是写完代码就运行,而是靠三类文件分工协作——就像拍一场小戏:得有舞台(Activity)、布景(XML 布局)、和指挥演员的导演(Java/Kotlin 逻辑)。这份计算器资源,正好把这三件套拆得明明白白,新手照着目录就能对号入座。

2.1 Activity:不是代码,是“容器身份证”

你打开项目,在app/src/main/java/下会看到一个以MainActivity开头的.java文件。别急着读里面那些public void onClick(...),先记住一点:MainActivity这个名字,不是随便起的,它是整个 App 启动时第一个被系统找出来的“门牌号”。
安卓系统启动 App 时,不看你的文件名,而是去查一个叫AndroidManifest.xml的清单文件。打开它,你会找到这么一段:

<activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>

提示:android:name=".MainActivity"里的那个英文句点.,代表“当前包名下的 MainActivity 类”。它就像快递单上的“收件人:张三”,系统只认这个名字,不认文件夹路径。

所以,MainActivity.java的核心任务,不是算加减法,而是告诉系统:“我这儿有个界面,你点图标进来,就加载我!”它本身不画按钮、不排版,只负责“领进门”。

2.2 XML 布局:用拖拽+代码,把按钮和屏幕“钉”在正确位置

真正让你看见按钮、数字、等号的地方,是app/src/main/res/layout/activity_main.xml这个文件。它长得不像 Java,更像一份“装修说明书”:用<Button>标签声明一个按钮,用android:text="5"写上按钮上印的字,用android:layout_width="wrap_content"控制它占多宽。

比如,这个计算器里最关键的“数字 0 按钮”,在 XML 里是这样写的:

<Button android:id="@+id/btnZero" android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="1" android:text="0" android:textSize="24sp" />

我们来逐行“翻译”:

  • android:id="@+id/btnZero":给这个按钮发一个“工号”,叫btnZero。后面 Java 代码要控制它,就靠这个 ID 找人;
  • android:layout_width="0dp"和android:layout_height="0dp":这是 ConstraintLayout(当前主流布局)的惯用写法,意思是“宽度高度由约束规则决定,别自己瞎猜”;
  • android:layout_weight="1":如果它和旁边几个按钮一起放在一个水平 LinearLayout 里(本项目实际用的是 ConstraintLayout,但 weight 是初学者最易懂的缩放逻辑),那它就“分得 1 份空间”;
  • android:text="0":按钮上显示的字,就是“0”;
  • android:textSize="24sp":字号 24,单位是sp(scale-independent pixel),这是安卓推荐的字体单位,能随系统字体大小自动缩放。

注意:你完全可以在 Android Studio 右上角点“Design”标签页,用鼠标拖一个按钮进来,改文字、调大小——Studio 会自动生成上面这段 XML。新手建议先拖后看,比纯手敲快十倍,也更容易建立“所见即所得”的信心。

2.3 Java 逻辑:三步走,让按钮真的“动”起来

现在舞台搭好了(Activity),布景挂好了(XML),就差导演喊“Action”。导演就是MainActivity.java里那一段段 Java 代码。它干三件事:

  1. 找人:根据 XML 里写的@+id/btnZero,用findViewById(R.id.btnZero)把按钮从界面里“抓”出来;
  2. 装耳朵:给按钮装上“监听器”(OnClickListener),相当于告诉它:“以后只要有人点你,就立刻通知我”;
  3. 下指令:在监听器的onClick()方法里,写具体要干什么——比如,把数字 0 加到当前显示的字符串后面。

来看真实的一小段(简化版):

// 1. 找到“0”按钮 Button btnZero = findViewById(R.id.btnZero); // 2. 给它装上“耳朵” btnZero.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 3. 下指令:获取当前屏幕上显示的文字 String currentText = textViewResult.getText().toString(); // 如果当前是"0",就别再加"0"了(避免显示"00") if ("0".equals(currentText)) { textViewResult.setText("0"); } else { // 否则,在后面拼上"0" textViewResult.setText(currentText + "0"); } } });

这段代码没用任何高级语法,全是“取值→判断→拼接→赋值”。它不神秘,就是把人脑里想的“点 0 就显示 0,再点还是 0”翻译成机器能执行的步骤。你改currentText + "0"为currentText + "★",点一下,屏幕上真会出现 ★——这种即时反馈,就是新手建立手感的关键。


3. 第一个能跑的例子:从新建项目到点出“2+2=4”,手把手带过

别跳过这章。很多新手卡在“新建项目就报错”“点了运行没反应”“按钮点了没变化”,不是代码难,是漏了某个默认勾选项,或没看清 Studio 窗口右下角的小提示。下面带你从零开始,用这份计算器资源,跑通第一个完整流程。全程基于 Android Studio 最新版(如 Giraffe 或 Hedgehog),所有路径、按钮名、选项都按真实界面描述。

3.1 下载解压后,第一步不是写代码,是“认祖归宗”

你拿到的是一份压缩包,解压后应该看到类似这样的文件夹结构:

CalculatorProject/ ├── app/ │ ├── src/ │ │ └── main/ │ │ ├── java/ ← Java 代码在这里 │ │ ├── res/ ← 图片、文字、布局 XML 在这里 │ │ └── AndroidManifest.xml │ └── build.gradle ← 项目配置文件(新手不用动) └── gradle.properties

提示:不要双击app/src/main/java/.../MainActivity.java单独打开它!必须用 Android Studio 打开整个CalculatorProject文件夹(File → Open → 选中 CalculatorProject 文件夹)。否则 Studio 不知道这是一个安卓项目,会当普通文本编辑器用,编译、运行全失效。

3.2 打开项目后,先确认三件事(缺一不可)

  1. 检查左上角 Project 面板是否显示 “Android” 视图
    默认可能是 “Project” 视图,一堆文件夹展开得很乱。点左上角下拉框,选 “Android”。这时你会清晰看到app→java→res→manifests四大块,结构一目了然。

  2. 确认右下角 Gradle 同步是否完成
    第一次打开,Studio 底部会弹出黄色横条:“Gradle project needs to be synced”。点它右边的 “Sync Now”。等待右下角出现绿色 “BUILD SUCCESSFUL” 字样,且 CPU 占用回落——这才算真正加载完毕。没同步完就点运行,大概率黑屏或闪退。

  3. 确认设备或模拟器已就绪
    点 Studio 右上角的设备选择框(通常显示 “Pixel_3a_API_34” 或 “No Devices”)。如果显示 “No Devices”,点右侧的 “+” 号,创建一个新模拟器(推荐:Pixel 3a, API Level 34, x86_64)。创建好后,它会自动出现在列表里,选中它。

3.3 点 Run,看它动起来——然后亲手改一个数字

一切就绪后,点顶部工具栏绿色三角形 ▶️(Run ‘app’)。Studio 会自动编译、安装、启动 App。几秒后,模拟器上会出现一个白底黑字的计算器界面,按钮排列整齐,点击有反馈。

✅ 成功标志:点 “1” → 屏幕显示 “1”;点 “+” → 显示 “1+”;点 “2” → 显示 “1+2”;点 “=” → 显示 “3”。

现在,我们来亲手改一个地方,验证你已掌握控制权:

  • 打开app/src/main/res/layout/activity_main.xml
  • 找到<Button>标签里写着android:text="0"的那一行(通常是底部中间那个 0 按钮)
  • 把"0"改成"〇"(中文圈圈,Unicode 字符)
  • 保存文件(Ctrl+S / Cmd+S)
  • 点 Studio 顶部菜单 Build → Make Project(或直接点 ▶️ 重新运行)

几秒后,模拟器上那个按钮就变成了“〇”。你没改 Java,没碰逻辑,只是换了界面上一个字符——这就是 XML 布局的威力:改界面,不碰代码;改逻辑,不动布局。职责分明,新手不易乱。


4. 新手必踩的 5 个坑:现象、原因、一招解决

刚上手时,90% 的“报错”都不是代码写错了,而是环境、配置、命名这些“看不见的线”没理顺。以下是用这份计算器资源时,K12 学生和大一新生反馈最多的 5 个问题,按发生频率排序,每条都配真实截图级描述(文字还原)。

4.1 现象:点 Run 后模拟器黑屏,或闪一下就关,Logcat 里满屏红色FATAL EXCEPTION

原因:AndroidManifest.xml里android:name=".MainActivity"写错了,比如多打了一个空格、字母大小写不符(写成mainactivity),或 Java 文件名与类名不一致(文件叫MainActvity.java,但类声明是public class MainActivity)。系统找不到“门牌号”,直接崩溃。

解决:

  1. 打开AndroidManifest.xml,逐字核对android:name的值;
  2. 打开MainActivity.java,看第一行public class XXX,XXX 必须和 Manifest 里完全一致(包括大小写);
  3. 确保文件名就是MainActivity.java,不能是mainactivity.java或MainActivity2.java。

4.2 现象:按钮点了没反应,Logcat 无报错,界面静止

原因:Java 代码里findViewById(R.id.xxx)的xxx,和 XML 中android:id="@+id/xxx"的xxx对不上。比如 XML 里写的是@+id/btn_equal,Java 里却写了R.id.btn_equals(多了一个 s),findViewById返回null,后续setOnClickListener就没绑定成功。

解决:

  1. 在 XML 中右键点击@+id/btn_equal→ 选 “Go to Declaration”,Studio 会跳转到R.java里生成的 ID 常量;
  2. 在 Java 中右键点击R.id.btn_equal→ 也选 “Go to Declaration”,看是否跳转到同一处;
  3. 如果 Java 里标红,说明 ID 不存在——回去检查 XML 拼写,或删掉R.java(Studio 会自动重建)。

4.3 现象:点数字按钮,屏幕显示乱码(如?或方块),或字体极小

原因:XML 中android:textSize单位写错了。新手常写成24px(像素),但安卓要求用sp(缩放像素)或dp(密度无关像素)。px会导致在不同手机上字号失真,甚至无法渲染。

解决:
把所有android:textSize="24px"替换为android:textSize="24sp"。同理,android:layout_width="100px"要改成"100dp"。记一句口诀:“文字用 sp,尺寸用 dp,绝对像素才用 px”。

4.4 现象:修改 XML 后,点 Run 没变化,还是旧界面

原因:Android Studio 的 “Apply Changes” 功能(闪电图标)有时不生效,尤其改了布局结构(如增删控件)。它只热更新部分代码,不重刷整个界面。

解决:
不要点闪电⚡,直接点绿色三角形 ▶️ 重新运行(Run)。虽然慢几秒,但 100% 刷新。等养成习惯后,再学Apply Changes and Restart Activity(闪电+圆圈)的快捷方式。

4.5 现象:模拟器启动极慢,CPU 占用 100%,风扇狂转

原因:模拟器分配的内存过大,或电脑未开启硬件加速(Intel HAXM / AMD Hypervisor)。学生用的笔记本,常默认分配 2GB 内存,但实际 1GB 就够计算器运行。

解决:

  1. 关闭模拟器;
  2. 打开 AVD Manager(Tools → Device Manager);
  3. 找到你的模拟器,点右侧铅笔图标 → Show Advanced Settings → Memory and Storage;
  4. 把 RAM 改成1024 MB,VM Heap 改成64 MB;
  5. 确保 “Enable Quick Boot” 打钩(下次启动快十倍);
  6. 点 Finish,重启模拟器。

5. 从“能跑”到“能改”:加一个“清除”按钮,练透四大核心能力

现在你已经能让计算器动起来,下一步不是学新框架,而是用同一个项目,加一个功能:一个“C”(Clear)按钮,点一下,清空当前所有输入和结果。这看似简单,却逼你串起安卓开发最基础的四大能力:XML 布局、ID 绑定、事件监听、UI 更新。我们一步步来,每步都解释“为什么这么写”。

5.1 第一步:在 XML 里加一个按钮(布局能力)

打开app/src/main/res/layout/activity_main.xml,找到数字按钮区域(通常是最后一行)。在 “0” 按钮左边,插入一个新的<Button>:

<Button android:id="@+id/btnClear" android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="1" android:text="C" android:textSize="24sp" android:backgroundTint="#FF5722" />

关键点解析:

  • @+id/btnClear:+表示“新建一个 ID”,Studio 会自动把它注册进R.id;
  • android:backgroundTint="#FF5722":给按钮上橙红色,和其它按钮区分开(十六进制颜色,#FF5722是 Material Design 的“深橙”);
  • layout_weight="1":保证它和 “0”、“=” 按钮等宽。

提示:加完保存,切到 Design 视图,你会立刻看到新按钮出现在界面上。这就是“所见即所得”的好处——布局错误,一眼就能发现。

5.2 第二步:在 Java 里找到它、绑监听(逻辑衔接能力)

打开app/src/main/java/.../MainActivity.java,在onCreate()方法里,所有findViewById语句的下方,添加:

// 找到清除按钮 Button btnClear = findViewById(R.id.btnClear); // 绑定点击事件 btnClear.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 清空显示框 textViewResult.setText("0"); // 清空运算状态(假设你有存储上一个数字和运算符的变量) // 这里先留空,下一节补全 } });

注意:textViewResult是显示结果的TextView,它的 ID 在 XML 里是@+id/textViewResult。如果你的项目里用的是别的 ID(如@+id/tv_result),请替换成你项目中的真实 ID。

5.3 第三步:理解“状态清空”的真正含义(业务建模能力)

计算器不是清屏就完事。它有内部状态:比如你输入了5+,此时显示 “5+”,但真正的“待运算数字”是 5,“待执行运算符”是 +。点 “C” 时,不仅要清显示,还要重置这些状态变量。

假设你的 Java 里有这两个变量(常见写法):

private double firstNumber = 0; // 第一个数字,如 5 private String operator = ""; // 当前运算符,如 "+" private boolean isOperatorPressed = false; // 标记是否刚按过运算符

那么onClick()里就要补全:

@Override public void onClick(View v) { textViewResult.setText("0"); firstNumber = 0; operator = ""; isOperatorPressed = false; }

提示:这些变量必须定义在MainActivity类里(onCreate外面),不能写在onClick里面,否则每次点按钮都会新建一个,起不到“记住状态”的作用。

5.4 第四步:验证与调试(工程闭环能力)

改完代码,点 ▶️ 运行。测试以下场景:

  • 输入3+5=→ 显示8;点C→ 显示0,再点2→ 显示2(不是02)✅
  • 输入7*→ 显示7*;点C→ 显示0,再点+→ 显示0+(不是7+)✅

如果没达到预期,打开 Logcat(底部面板),筛选MainActivity,在onClick里加一行日志:

Log.d("Calc", "Clear button clicked, firstNumber=" + firstNumber);

运行后点 C,看 Logcat 是否打印出firstNumber=0—— 这是排查状态是否真被重置的“后悔药”。


6. 下一步学什么:一张表,规划你从计算器到真实 App 的升级路径

跑通计算器只是起点。接下来你想做“记账本”“单词打卡”“课程表”,本质都是在计算器这个骨架上,不断替换和叠加模块。我当年带某高校 K12 编程夏令营时,就是用这张表,帮 32 个零基础学生,三个月内全部做出自己的第一个可发布 App。它不堆概念,只列“下一个你能动手的、带明确产出的目标”。

你想实现的功能需要新增的模块从计算器项目里直接复用的部分你只需额外学的(1 小时内能懂)推荐练习顺序
记住上次算的结果,重启 App 还在SharedPreferences(轻量本地存储)MainActivity.java结构、textViewResult显示逻辑getSharedPreferences()怎么存/取一个字符串;onResume()里读取并显示第 1 个拓展
输入 1234567890,屏幕自动换行不溢出ScrollView(可滚动视图)XML 布局思维、android:textSize单位把<TextView>包进<ScrollView>,设置maxLines="1"和scrollHorizontally="true"第 2 个拓展
点“历史”按钮,弹出之前算过的所有式子ListView或RecyclerView(列表控件)Button监听、Intent启动新页面ArrayAdapter怎么把字符串数组变成列表项;startActivity()跳转到新 Activity第 3 个拓展
支持小数点,如 3.14+2.5=5.64字符串解析逻辑(Double.parseDouble())数字按钮逻辑、onClick事件处理try-catch捕获NumberFormatException(防止用户乱输);String.contains(".")判断是否已有小数点第 4 个拓展
换个主题色,白天蓝、夜晚暗values-night资源目录colors.xml颜色定义、android:backgroundTint创建res/values-night/colors.xml,复制colors.xml内容,只改颜色值;Studio 自动识别第 5 个拓展

你看,没有一个目标需要你先啃完《安卓开发从入门到放弃》。它们全是从计算器这个“最小可运行单元”自然长出来的枝杈。我的血泪经验是:永远别学“RecyclerView 是什么”,而要学“怎么让历史记录像微信聊天一样一条条列出来”。前者是名词,后者是动词,是新手唯一能抓住的把手。

从那以后我每次教新人,都强制他们做完计算器后,必须立刻选表里第一个目标(SharedPreferences 存历史),花一小时改完、跑通、截图发群里。不是为了交作业,而是用一次真实的“数据跨重启留存”,亲手打破“App 关了数据就没了”的幻觉——这种确定性,比讲十遍生命周期都管用。

希望帮到你。

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

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

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

立即咨询