ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Android Studio学生选课系统:零基础入门实战项目

Android Studio学生选课系统:零基础入门实战项目

简介:这份资源是面向Android初学者与在校学生的学生选课系统完整工程源码,基于Android Studio开发,可用于课程设计、毕业设计或Android入门实战练习。压缩包共620个文件,约56.75MB,以flat、json、xml、dex、class等构建与编译产物为主,另含java源码、properties配置、gradle构建脚本及少量png、jpg界面素材,完整保留了app模块、Gradle构建体系与本地配置,目录结构贴近真实项目。资源围绕Android Studio、Gradle构建、RecyclerView课程列表、SQLite选课数据存储及网络通信等知识点展开,读者可据此理解选课系统的界面设计、数据持久化与依赖管理流程,并对照build.gradle、AndroidManifest.xml等配置排查构建问题。目前已有2086人学习下载,适合希望从零跑通一个安卓项目、积累工程经验的学习者参考。

1. 从零看懂:android studio 学生选课系统到底是什么

很多刚接触编程的同学,第一次听到「android studio 学生选课系统」这串词,脑子里会冒出三个问号:android studio 是个啥?选课系统我天天用,跟我有什么关系?这两样凑一起,是要我干嘛?其实把它拆开就很好理解了。android studio 是一个专门用来写安卓手机 App 的工具,你可以把它想成一个「做手机软件的厨房」,锅碗瓢盆都给你备好了;而学生选课系统,就是我们要在这个厨房里做出来的一道菜——一个能在手机上点开、登录、看到课程列表、点一下就能选上课的小应用。

那为什么零基础的人要拿它练手?因为选课系统这个题目特别「刚刚好」。它不像做个聊天软件那样要处理实时消息,也不像做个游戏那样要懂图形渲染,它只需要你搞定三件最基础的事:把数据存起来、把数据显示在屏幕上、让用户点按钮能触发操作。这三件事,恰恰是所有 App 的骨架。你把选课系统跑通了,等于把安卓开发最核心的那套流程走了一遍,后面再学别的,心里就有底了。这份资源适合谁?适合刚学完一点点编程基础、想动手做个完整小项目、但一打开 android studio 就不知道从哪点起的新手。它不要求你会高深算法,只要求你愿意跟着步骤一步步敲。

2. 为什么值得学:选课系统是安卓入门的「最小完整闭环」

2.1 它把安卓开发的四大件全串起来了

学安卓最怕什么?最怕学了一堆零散知识,却不知道它们怎么拼在一起。今天学个按钮怎么摆,明天学个数据怎么存,学完还是做不出东西。选课系统这个项目的好处,就是它天然需要你把安卓开发的几个核心部件都用上,而且用得明明白白。

第一个部件是界面,也就是你在手机上看到的样子。选课系统至少要有登录页、课程列表页,可能还有一个「我的课程」页。这就逼着你去理解安卓里「一个页面就是一个 Activity」这件事。第二个部件是数据,课程信息从哪来?总不能每次打开 App 都手动输一遍。这就逼着你去碰数据存储,哪怕只是用一个最简单的本地数据库或者一个写死的列表。第三个部件是交互,用户点了「选课」按钮,界面得给个反应,是弹个提示,还是把按钮变成「已选」,这就逼着你去学事件监听。第四个部件是页面跳转,登录成功后要跳到课程列表,这就逼着你去学 Intent。

你看,一个看起来简单的选课系统,其实把安卓入门阶段最该掌握的几样东西全装进去了。我第一次学的时候,就是东学一块西学一块,结果连一个能从头点到尾的 App 都做不出来,那种挫败感特别强。后来换成跟着一个完整小项目走,才真正把知识串成了线。选课系统就是那条线,它不花哨,但足够完整。

2.2 需求简单,意味着你能把注意力放在「流程」上

很多新手选项目容易犯一个错:一上来就挑个「看起来很酷」的,比如做个短视频 App、做个外卖平台。结果光是需求就复杂到理不清,更别说写代码了。选课系统的业务逻辑简单到可以用一句话说清:学生登录,看到课程,选课,选课记录保存下来。没有支付,没有实时推送,没有复杂的权限体系。

这种简单反而是优势。因为你的注意力不用被业务逻辑分散,可以全部放在「安卓开发的标准流程」上:怎么建项目、怎么在布局文件里摆控件、怎么在代码里找到这个控件、怎么给它加点击事件、怎么把数据从一个页面传到另一个页面。这些流程走顺了,你以后做任何 App 都是同一套动作。我带过的新手里,凡是老老实实把一个小系统从头到尾做出来的,后面进步都明显更快,因为他们心里有了一张「地图」,知道一个功能从想法到落地要经过哪几步。

2.3 它能让你第一次体会到「我做出了一个能用的东西」

零基础学编程最需要的是什么?是正反馈。你对着教程敲了三天代码,如果屏幕上什么都没出现,很容易就放弃了。但选课系统不一样,你每完成一步,都能立刻看到效果:布局写好了,预览窗口里就出现了登录框;按钮事件写好了,点一下真的弹出了提示;数据存好了,关掉 App 再打开,之前选的课还在。这种「看得见摸得着」的反馈,是支撑你走下去的关键。

而且这个项目做完,你是可以拿给别人看的。哪怕它很简陋,但它是一个完整的、能安装到手机上、能点能用的东西。这种成就感,比做一百道练习题都管用。入门阶段,信心比知识更稀缺,选课系统恰好能给你这份信心。

3. 动手之前:把环境和第一个页面跑起来

3.1 先装好 android studio,别在这一步卡住

入门的第一道坎往往不是写代码,而是装环境。android studio 的安装包比较大,下载和首次启动都需要一点耐心。你去官网下载对应你操作系统的版本,一路点下一步就行。安装过程中它会自动帮你装好安卓 SDK,也就是开发安卓 App 需要的一套工具包,这一步不用你手动干预。

装完之后第一次打开,它会引导你创建一个新项目。这里有个小建议:入门阶段选「Empty Views Activity」这个模板,不要选带 Compose 的模板。原因很简单,网上绝大多数基础教程、你遇到问题时能搜到的答案,都是基于传统视图体系的,选这个模板能让你少走很多弯路。项目名字随便起,比如叫 CourseDemo,语言选 Java 或 Kotlin 都行。如果你完全没接触过 Kotlin,选 Java 会更稳一些,因为它的语法对新手更友好,资料也更多。

创建完成后,你会看到左边一排文件目录,中间是代码编辑区。别被吓到,入门阶段你真正需要关心的文件就那么几个:布局文件在res/layout/下面,页面逻辑代码在java/你的包名/下面。其他的先不用管,它们不影响你做出第一个能跑的页面。

提示:第一次打开项目时,底部会有一个进度条在跑,那是在下载依赖和同步项目,耐心等它跑完,不要急着点别的按钮,否则容易卡住。

3.2 写第一个布局:一个登录框长什么样

环境好了,我们来写第一个能看见的东西——登录页面。安卓的界面是用 XML 描述的,你可以把它理解成「给屏幕排版的一份说明书」。打开res/layout/activity_main.xml,把里面的内容换成下面这样:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="24dp"> <!-- 标题文字 --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="学生选课系统" android:textSize="24sp" /> <!-- 学号输入框 --> <EditText android:id="@+id/etStudentId" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入学号" /> <!-- 登录按钮 --> <Button android:id="@+id/btnLogin" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="登录" /> </LinearLayout>

这段代码的意思很直白。最外层的LinearLayout是一个「竖着排队」的容器,里面放的东西会从上到下依次排列。orientation="vertical"就是告诉它竖着排,padding="24dp"是给四周留点空隙,不然文字会贴着屏幕边,很难看。里面放了三个控件:TextView是纯文字,用来显示标题;EditText是输入框,用户可以在里面打字;Button是按钮,用来点。

每个控件都有layout_width和layout_height,match_parent表示「跟父容器一样宽」,wrap_content表示「内容多大我就多大」。id是给控件起个名字,后面在代码里要靠这个名字找到它,所以etStudentId和btnLogin这两个名字要记住。hint是输入框里的灰色提示文字,用户一开始打字它就消失。

写完保存,点右上角的预览按钮,你就能看到这个登录框的样子了。这一步不需要运行模拟器,预览就够。看到界面出来的那一刻,你就已经跨过了「什么都看不见」的阶段。

3.3 让按钮真的能点:第一个交互事件

界面有了,但按钮现在是个摆设,点了没反应。我们让它弹出一句提示。打开MainActivity.java,在onCreate方法里加上找控件和设监听的代码:

public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 通过 id 找到布局里的输入框和按钮 EditText etStudentId = findViewById(R.id.etStudentId); Button btnLogin = findViewById(R.id.btnLogin); // 给按钮设置点击监听 btnLogin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 取出用户输入的学号 String studentId = etStudentId.getText().toString(); // 弹出一个短提示 Toast.makeText(MainActivity.this, "学号 " + studentId + " 登录成功", Toast.LENGTH_SHORT).show(); } }); } }

逐句解释一下。setContentView(R.layout.activity_main)是把刚才写的那个布局文件「贴」到这个页面上,没有这一句,页面就是空白的。findViewById就是拿着 id 去布局里把控件找出来,找到之后存到一个变量里,后面就能操作它。setOnClickListener是给按钮装一个「被点击时要做的事」,里面那个onClick方法就是点击发生后执行的代码。getText().toString()是把输入框里的内容取出来变成字符串。Toast是安卓里最轻量的提示,屏幕下方弹一个小条,几秒后自动消失,适合做这种即时反馈。

现在点运行按钮,选一个模拟器或者连上你的手机,等它安装完,你就能在屏幕上输入学号、点登录、看到提示弹出来了。这是你做的第一个真正能交互的安卓功能,虽然简单,但流程是完整的:布局定义界面,代码找到控件,事件触发逻辑。

4. 把选课系统做完整:数据、列表和页面跳转

4.1 课程数据从哪来:先用一个写死的列表

登录跑通了,接下来要有课程。真实系统里课程数据肯定存在服务器或者数据库里,但入门阶段我们先不碰那么复杂的东西,用一个写死在代码里的列表就够了。这样做的好处是,你能先把「数据怎么显示到屏幕上」这件事搞明白,而不用同时应付网络请求和数据库。

在MainActivity里加一个方法,返回一个课程列表:

// 模拟课程数据,入门阶段先用写死的方式 private List<Course> getCourseList() { List<Course> list = new ArrayList<>(); list.add(new Course("C001", "高等数学", "周一 1-2 节")); list.add(new Course("C002", "大学英语", "周二 3-4 节")); list.add(new Course("C003", "程序设计基础", "周三 5-6 节")); return list; }

这里的Course是一个你自己定义的数据类,用来把一门课的编号、名称、时间打包在一起。你可以新建一个Course.java文件,里面只放三个字段和对应的 getter 方法。为什么要单独定义一个类,而不是用三个列表分别存编号、名称、时间?因为一门课的信息是一个整体,打包在一起,后面传递和显示都方便,不容易出现「编号和名称对不上」这种低级错误。这是入门阶段就该养成的习惯:相关的数据放在一起。

4.2 用列表控件把课程显示出来

有了数据,就要显示。安卓里显示一列数据最常用的控件是RecyclerView,它负责把每一条数据变成一个列表项,并且在你滑动时复用屏幕外的项,性能好。入门阶段你不需要深究它的复用原理,只要会「给它数据、告诉它每一项长什么样」就行。

先在布局里加一个RecyclerView,然后在代码里给它设置一个适配器。适配器你可以理解成「翻译官」,它负责把Course对象翻译成屏幕上的一行。你需要写一个简单的适配器类,继承RecyclerView.Adapter,在里面指定每一项用哪个布局、每个文字控件显示哪个字段。这个过程第一次写会觉得有点绕,但套路是固定的:创建视图、找到控件、绑定数据,三步走。写完运行,你就能看到一个可以上下滑动的课程列表了。

注意:RecyclerView的适配器里,onBindViewHolder方法会被反复调用,所以里面只做「把数据填到控件上」这件事,不要在里面做耗时操作,否则列表会卡。

4.3 点一门课就选上:把选择结果存下来

列表能看了,最后一步是「选课」。给列表的每一项加点击事件,点中之后把这门课加到一个「已选列表」里,并且给用户一个反馈,比如把那一项的背景变色,或者弹个提示。已选列表可以先存在内存里,也就是一个List<Course>变量,App 关掉就没了。等你把这一版跑通,再考虑用SharedPreferences或者 SQLite 把它持久化下来,那是下一步的事。

这里有个新手常犯的错:在适配器里直接new一个列表来存已选课程,结果每次列表刷新,数据就丢了。正确的做法是把已选列表放在 Activity 或者一个单独的类里,适配器只负责显示和把点击事件往外传。数据的所有权要清晰,谁创建谁管理,别让显示层去管数据。

4.4 页面跳转:从登录页到课程页

一个完整的 App 不可能只有一个页面。登录成功后,应该跳到课程列表页。这就用到Intent,你可以把它理解成一张「跳转指令」,告诉系统「我要从当前页面去另一个页面」。写法很简单:

// 登录成功后跳转到课程列表页 Intent intent = new Intent(MainActivity.this, CourseListActivity.class); startActivity(intent);

CourseListActivity是你新建的另一个 Activity,里面放课程列表的逻辑。跳转过去之后,按返回键还能回到登录页,这是安卓默认的行为。如果你想把学号传过去,可以用intent.putExtra("studentId", studentId),然后在目标页面用getIntent().getStringExtra("studentId")取出来。这套传参方式在入门阶段够用了,虽然它有局限,但先跑通再说。

5. 新手避坑:这几个坑我几乎每次都见人踩

5.1 现象:改完布局,运行后界面没变化

原因通常有两个。一是你改的不是当前页面用的那个布局文件,项目里可能有好几个activity_xxx.xml,你改错了。二是你改了布局但没重新运行,预览窗口更新了,但手机上装的还是旧版本。解决方法是:先确认setContentView里写的是哪个布局文件名,再去改那个文件;改完一定要重新点运行,别只看预览。

5.2 现象:findViewById返回空,一用就崩溃

这是新手最常见的崩溃之一。原因基本是 id 对不上:布局里写的是etStudentId,代码里写成了etStudentID,大小写不一样,或者干脆忘了在布局里加android:id。解决方法是:复制布局里的 id 到代码里,别手打;崩溃时看日志里NullPointerException那一行,它会告诉你哪个变量是空的,顺着去找对应的findViewById。

5.3 现象:模拟器启动特别慢,或者干脆起不来

原因多半是电脑没开虚拟化支持,或者模拟器分配的内存太小。解决方法是:进 BIOS 把虚拟化打开(不同主板位置不一样,搜你的主板型号加「开启虚拟化」能找到);或者在模拟器设置里把内存调大一点。如果实在搞不定模拟器,直接用数据线连真机调试,打开手机的开发者模式和 USB 调试,往往比模拟器省心。

5.4 现象:列表滑动卡顿,或者数据错乱

原因通常是适配器里做了不该做的事,比如在onBindViewHolder里加载图片、做计算,或者复用了视图却没重置所有字段。解决方法是:绑定方法里只做赋值;如果某一项有的字段有值、有的没有,记得在绑定前先把所有字段重置一遍,否则复用的旧视图会带着上一条数据「串台」。

5.5 现象:改了一个地方,别的地方跟着报错

原因是你可能动了公共的布局或者数据类,影响到了其他页面。入门阶段项目小,这种连锁反应还不多,但要有这个意识:改公共文件之前,先想清楚哪些地方在用。解决方法是:养成小步提交的习惯,改一点跑一次,出问题能立刻定位到是哪次改动引起的,别攒一大堆改动再一起运行。

6. 下一步学什么:从能跑到跑得稳的学习路径

第一个能点能选的版本跑通之后,你可能会有点迷茫:接下来该往哪走?我的建议是按「先补数据、再补结构、最后补体验」的顺序来,别贪多。

先补数据。你现在选的课关掉 App 就没了,这不像个真系统。下一步去学SharedPreferences,它适合存这种简单的键值对,比如把已选课程编号拼成一个字符串存起来。学会之后,再去看 SQLite 或者 Room,那是正经的本地数据库,能存结构化的课程表和选课记录。这一步走完,你的 App 就有了「记忆」。

再补结构。现在你的代码可能全堆在 Activity 里,页面一多就乱。去了解一下ViewModel和Repository这种分层思路,不用学太深,知道「界面归界面、数据归数据」就行。同时把写死的课程列表换成一个真正的数据源,哪怕只是从本地 JSON 文件读,也能让你体会「数据和界面分离」的好处。

最后补体验。加一个「我的课程」页面,用BottomNavigationView做底部切换;给选课加一个确认弹窗;列表项加个选中状态。这些都不难,但能让你的 App 看起来完整很多。做完这些,你就可以尝试把数据放到一个简单的后端接口上,学一学怎么用OkHttp或者Retrofit发网络请求,那时候你就算真正踏入安卓开发的门了。

阶段学什么大概花多久
第一步SharedPreferences 存选课记录一到两天
第二步Room 数据库建课程表和选课表三到五天
第三步ViewModel 拆分界面与数据两到三天
第四步Retrofit 请求网络数据一周左右

这张表只是给你一个节奏参考,不用严格卡时间,做出来才算数。我带新人的血泪经验是:每学一个新东西,就立刻塞进选课系统里用一遍,别单独看教程。看懂了和写出来是两回事,写出来和能跑通又是两回事。

从那以后我每次带人入门,都强制要求先把一个最小版本从头到尾跑通,再去补新知识,因为只有跑通过一次,你才知道一个功能从想法到落地中间要经过哪些环节,后面学什么心里都有底。希望这份路径能帮到你,先从把登录框跑出来开始,别想太多,动手就对了。

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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进