系统目录

  • 一、项目背景
  • 二、需求分析
  • 三、开发环境
  • 四、详细设计
    • 1、主界面
    • 2、 预定座位
    • 3、 查看座位
    • 4、个人信息
    • 5、我的步数
    • 6、数据库
  • 五、运行演示
  • 六、项目总结
  • 七、源码获取

一、项目背景

在校园生活中,图书馆是很多人选择的学习圣地,这里不仅充满书香气息,而且还十分静谧。这样的学习环境,必然会很抢手,导致很多学生早早就来图书馆占座,渐渐地因为一直占不到座的同学就失去了学习的动力。

针对这样的实际问题,我们设计了一款图书馆订座系统。主要有四大功能模块,包括预订座位、查看座位、个人信息和我的步数。预订座位可以选3层楼,每层楼座位表不同,每位学生同一时间只能预订一个座位;查看座位的楼层和座位号,如果离开图书馆了,可以退订座位;在个人信息中可以点击编辑进入编辑模式,保存进入查看模式;最后我的步数可以进行计步,还有每日名言警句。整体功能很完善,界面设计美观。

二、需求分析

订座系统满足以下所有的要求:

  1. 项目主题中要体现解决现实中的某种实际问题
  2. 项目app不能是单机版
  3. UI设计要求简单美观、实用性强
  4. 项目至少包含4个功能模块,功能模块必须与题目相关
  5. 使用技术的要求:
a.网络通信(socket或http) b.数据库 c.传感器 d.多线程

三、开发环境

打开Android Studio,Help——>About,只要你的AS是从官网下载的都可以运行。比如小蜜蜂版本就是2021.1.1,这种日期形式的都完全OK。

四、详细设计

1、主界面

这里最上面是一个ViewPager,用来显示轮播图,下面就是四个设置了bg的按钮,在预定座位下面是一个RadioGroup,包含3个单选按钮。

这里实现轮播图的主函数initPager(),声明了图片和小点列表并初始化。对于绑定的ImageView,我们依次设置图片数组中的图片,设置它的ScaleType为FIT_XY,进行平铺图片。接着设置图片view的宽高,然后将这张图片放入ivList,小圆点也是同样的方式, pointLayout.addView(piv);将小圆点添加到布局当中。这样的数据源就添加好了,实例化个适配器,然后ViewPager加载适配器即可。和列表显示的原理很像。

private void initPager() {ivList = new ArrayList<>();pointList = new ArrayList<>();for (int i = 0; i < imgIds.length; i++) {ImageView iv = new ImageView(this);iv.setImageResource(imgIds[i]);iv.setScaleType(ImageView.ScaleType.FIT_XY);// 设置图片view的宽高LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);iv.setLayoutParams(lp);// 将图片view加载到集合中ivList.add(iv);// 创建图片对应的指示器小圆点ImageView piv = new ImageView(this);piv.setImageResource(R.drawable.point_normal);LinearLayout.LayoutParams plp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);plp.setMargins(20, 0, 0, 0);piv.setLayoutParams(plp);// 将小圆点添加到布局当中pointLayout.addView(piv);// 为了方便操作,将小圆点加入统一管理的集合pointList.add(piv);}pointList.get(0).setImageResource(R.drawable.point_focus);pagerAdapter = new PagerAdapter(this, ivList);libraryVp.setAdapter(pagerAdapter);}

2、 预定座位

在座位表设置这里,我构思了很长时间,到底使用什么控件来表示座位最好?TextView、Button还是RadioButton,思来想去最好决定还是RadioButton。那么问题又来了,RadioGroup是继承LinearLayout布局的,只能水平和垂直,所以导致了每一行都能选择一个单选按钮,这样就和每位学生选一个座位矛盾了,如何解决?

根据之前在力扣刷题的经验,这里我们需要对每一行控件进行设置,当选中第i行的单选按钮时,取消其他行的状态,这样实现很繁琐,但是很有效。

根据数据库中记录的状态,设置所有单选按钮的状态。

        // 遍历所有单选按钮for (int i = 0; i < radioArray.length; i++) {int id = radioArray[i].getId();boolean ordered = false;// 遍历已选中的单选列表for (int j = 0; j < seatList.size(); j++) {if (seatList.get(j).getId() == id) {radioArray[i].setBackgroundResource(R.drawable.bg_seats_ordered);radioArray[i].setEnabled(false);ordered = true;break;}}// 退订座位后恢复可选if (!ordered && !radioArray[i].isEnabled()) {radioArray[i].setEnabled(true);radioArray[i].setBackgroundResource(R.drawable.bg_seats);}}

单选按钮的监听器逻辑,梦回当年的力扣刷题。

        // 每一组的监听器radioGroup1.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup radioGroup, int i) {// 清除其他组的选择for (int k = 0; k < radioGroups.length; k++) {if (k == 0) continue;if (radioGroups[k].getCheckedRadioButtonId() != -1) {radioGroups[k].clearCheck();}}// 获取seat对象seat = new Seat(i, account);}});

3、 查看座位

这里可以看到你的座位信息,如果没有订座则默认显示“暂无信息”。


这里的java文件实在太简单了,没必要讲了,提一下用到的数据库方法,退订的逻辑就是先找到它的楼层,然后在对应的楼层表中删除这个座位信息。

    // 退订public void cancelFloor(Seat seat) {String table[] = new String[]{"First", "Second", "Third"};int index = getFloor(seat);sqLiteDatabase.delete(table[index - 1], "account = ?", new String[] {seat.getAccount()});}

4、个人信息

这里图标和TextView的背景的设置是最花时间的,布局倒非常简单。

定义两个方法,进行模式切换,就是利用enable这个属性。

    // 编辑模式,可以编辑private void enableEditor() {etName.setEnabled(true);etAge.setEnabled(true);etPhone.setEnabled(true);etCollege.setEnabled(true);btnSave.setVisibility(View.VISIBLE);btnUpdate.setVisibility(View.INVISIBLE);}

5、我的步数

这里使用了android传感器技术和多线程,首先看下布局,虽然简单但是设计上还是额外花了1个多小时,反复调整样式。最上面是名言警句,调用的天行api接口,然后下面是步数显示。


这里我们使用的是加速度传感器,通过检测加速度变化的峰值来判断我们移动,从而记录步数,我们手机会有很多传感器,比如:温度传感器、距离传感器、角速度传感器、重力传感器等。下面是传感器的使用模板:

 sManager = (SensorManager) getSystemService(SENSOR_SERVICE);mSensorAccelerometer = sManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);sManager.registerListener(this, mSensorAccelerometer, SensorManager.SENSOR_DELAY_UI);

我们创建client实例,然后创建一个request实例,封装了url请求地址,使用newCall让客户端向服务器发送http请求,并且自动放入子进程中进行请求。这样,我们在onResponse中得到服务器返回的具体内容,然后解析数据,在UI线程中更新数据。

public class HttpUtil {public static void sendOkHttpRequest(String address, okhttp3.Callback callback) {OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url(address).build();client.newCall(request).enqueue(callback);}
}

我们对获取的数据进行json解析,就像天气预报、星座配对一样,json数据其实就分为数组和对象,而且java帮我们封装的非常好,使用GSON来处理非常简单方便。

        // 使用gson解析数据Aphorism aphorism = new Gson().fromJson(result, Aphorism.class);Aphorism.NewslistDTO newslistDTO = aphorism.getNewslist().get(0);String saying = newslistDTO.getSaying();String transl = newslistDTO.getTransl();String source = newslistDTO.getSource();

6、数据库

数据库名称为library.db,一共有五张表,每张表的属性主要是根据Bean实体类进行设置。

    // 创建用户表Userpublic static final String CREATE_USER = "create table User ("+ "account text primary key,"+ "password text)";// 创建一楼已预定座位表public static final String CREATE_FIRST = "create table First ("+ "id integer primary key,"+ "account text)";// 创建二楼已预定座位表public static final String CREATE_SECOND = "create table Second ("+ "id integer primary key,"+ "account text)";// 创建三楼已预定座位表public static final String CREATE_THIRD = "create table Third ("+ "id integer primary key,"+ "account text)";// 创建学生表Studentpublic static final String CREATE_STUDENT = "create table Student ("+ "account text primary key,"+ "name text,"+ "age text,"+ "phone text,"+ "college text)";

五、运行演示

1、运行项目,进入欢迎界面。


2、进入登录界面,我们点击新用户注册,进入注册界面。


3、进入注册界面,我们输入学号和密码之后,点击注册,如果注册成功则返回登录界面。

4、注册完学号和密码都会被传递过来,我们直接点击登录。


5、进入主界面,顶上是轮播图,一共五张精美图片在自动切换,我们也可以手动切换,然后下面的小圆点就对应了图片的下标。下面分别是四个功能栏。我们选择1楼,然后点预订座位

6、进入一楼座位表,我们可以选择座位,选中会有颜色变化,然后点击悬浮按钮确定选座。

7、我们预订个1排一座的位置。


8、因为我们同一时间最多只能预订一个座位,所以再预约其他座位必须退掉已预订的座位才行。


9、返回主界面,点击查看座位,可以看到我们座位的楼层和座位号。

10、点击退订,然后我们退出该界面,再次点击查看信息,发现暂无信息。

11、点击个人信息,进入个人信息界面,点击修改信息按钮,进入编辑模式,编辑完之后点击保存按钮,则进入查看模式。

12、我们输入个人信息,编辑完之后,点击保存信息。

13、返回主界面,点击进入我的步数,这里最上面是名人名言、译文和出处。名人名言会每次在进入该界面时都更新。下面是计步显示。


14、我们点开模拟器右侧的省略号,跳出Extended controls,然后点击Virtual sensors,进入虚拟传感器界面。

15、我们选择Move,然后不断拖动Y的进度条,因为手机在竖直放置时,Y轴是垂直于地面的,所以会产生加速度,进而记录步数。


16、点击停止会清零步数,重新计步。

17、我们再注册个用户111进行登录,点击预订座位,进入座位表,可以看到1排1琢已经无法选中了,因为被123用户预订了。我们选择6排1座,然后预订、


18、再次进入选座界面,可以看到这两个座位都变为灰色背景无法选中了。

19、三层楼的座位布局都不尽相同,我们可以查看三楼的座位表,和一楼有很大差别。

六、项目总结

本次项目使用了ViewPager、Sqlite、FloatingButton、RadioGroup、Http请求、Adapter、Sensor等知识。相对来说还是很简单的,与之前不同的主要是Sensor传感器这一项,其实Android知识非常多,想要深入学习学通还需要花很长时间。不过我个人来看,程序开发相对于深度学习搞算法来说还是非常容易的,毕竟创造有突破性的算法比创造新的软件要难100倍。

七、源码获取

Android Studio实现简单的图书馆订座系统相关推荐

  1. android页面布局计算机,Android Studio制作简单计算器App

    Android Studio制作简单计算器App 计算机界面如图: 程序设计步骤: (1)在布局文件中声明编辑文件框EditText,按钮Button等组件. (2)在MainActivity中获取组 ...

  2. 使用Android Studio实现简单的计算器(已亲自实验通过)

    使用Android Studio实现简单的计算器(已亲自实验通过) 实验内容 用多个Activity实现分别实现加.减.乘.除的计算器,具体包括:通过一个启动Activity布置4个按钮,每个按钮分别 ...

  3. Android实现有声计算器代码,android studio实现简单的计算器(无bug)

    本文实例为大家分享了android studio实现简单计算器的具体代码,供大家参考,具体内容如下 1.效果图 2布局代码 3.逻辑代码 package com.example.myzhuoye; i ...

  4. github android 计算器,Android studio实现简单的计算器

    本文实例为大家分享了Android studio实现简单计算器的具体代码,供大家参考,具体内容如下 需求分析及概要设计 目的 开发一个简单的计算器App,使之能够完成加减乘除混合运算 工具及环境 使用 ...

  5. android 购物车实现,Android Studio实现简单购物车功能

    Android Studio实现简单购物车功能 发布时间:2020-08-30 17:23:56 来源:脚本之家 阅读:241 作者:攀岩嘉 本文实例为大家分享了Android九宫格图片展示的具体代码 ...

  6. 计算器android studio代码,Android studio实现简单计算器

    本文实例为大家分享了Android studio实现简单计算器的具体代码,供大家参考,具体内容如下 需求分析 在Android studio中设计并实现一个简单的计算器,实现连续的加减乘除运算. 界面 ...

  7. Android Studio实现简单的音乐播放(播放、暂停、停止、上一首、下一首)

    Android Studio实现简单的音乐播放(播放.暂停.停止.上一首.下一首) 简要介绍 采用Service组件实现后台播放,BroadcastReceiver实现消息传递.BroadcastRe ...

  8. Android Studio 超级简单的打包生成apk的方法

    本文介绍了Android Studio 超级简单的打包生成apk,分享给大家,也给自己留个笔记. 为什么要打包: apk文件就是一个包,打包就是要生成apk文件,有了apk别人才能安装使用.打包分de ...

  9. 用Android studio完成简单的显示时间

    用用Android studio完成简单的显示时间,并完成基础的布局改变,如字体大小,字体颜色等等问题. 在value中,颜色设置,可以自定义颜色. dimens中完成字体大小的设置. 完成日历设置: ...

  10. android播放mp3功能,Android Studio实现简单音乐播放功能的示例代码

    项目要求 基于Broadcast,BroadcastReceiver等与广播相关的知识实现简单的音乐播放功能,包括音乐的播放.暂停.切换.进度选择.音量调整. 设计效果 (进度条时间刷新功能还没有实现 ...

最新文章

  1. 关于图像语义分割的总结和感悟
  2. 使用python来批量抓取网站图片
  3. 在Linux系统终端利用ggc,大学计算机:Linux下C编程.pdf
  4. AT3968-[AGC025E] Walking on a Tree【构造】
  5. 高薪、稀缺人才必备哪些技能?BDTC大会告诉你,附最新议程!
  6. Dato for Mac(菜单栏时钟工具)支持m1
  7. formData:解决formData使用append追加后console仍为空
  8. Atitit 提升进度的大原则与方法  高层方法  attilax总结
  9. MCS:连续随机变量——Beta分布
  10. 激励函数-Activation Funciton
  11. BM3D算法半解,带python代码
  12. 企业报表系统搭建很难?其实选对工具就成功了一半
  13. 华为防火墙默认密码是什么?
  14. 算法设计与分析第一章作业
  15. 白山搜索引擎优化收费_白山SEO-白山网站优化-白山新站整站快速排名-【
  16. codeforces1000a csdn-博客
  17. 【云计算】云计算的优势以及未来的发展趋势
  18. 千万要找一个程序员谈恋爱!
  19. linux下使用AppImage打包qt程序
  20. mysql order by 嵌套查询_MySQL第三章——嵌套查询

热门文章

  1. Vensim模拟结果vdf数据文件转化为可读文本文件
  2. JMeter 录制脚本
  3. 百度智能云人脸库的创建与使用
  4. Autodesk Eagle入门之-开启旅程
  5. 约瑟夫环c语言程序完整版,约瑟夫环的c语言实现(代码已实现)
  6. CSITool的安装过程(参照官方教程进行细节处理)
  7. JDK 11 API中文帮助文档
  8. Java权限管理系统
  9. Fiddler安装及使用教程
  10. 图像特征:突出显示稀疏突出区域Image Signature:Highlighting Sparse Salient Regions