智慧城市开发流程记录

Android Studio 智慧城市项目开发过程记录分享

AS常用快捷键

代码格式化

Ctrl+Alt+L

打开源代码

选择一个字段使用快捷键可以打开字段源文件

Ctrl+B

往下一行插入换行

这种换行不需要特意在行末添加换行

shift+enter

往上一行插入换行

ctrl+alt+enter

在行末(分号后)添加换行

如果分号下一行已经是空行则不会添加而是转到那一行

ctrl+shift+enter

方法间上下跳转

按住alt+上下方向键

切换当前编辑文件

按住alt+左右方向键

字段间左右移动

ctrl+左右方向键

页面上下滑动

ctrl+上下方向键

复制当前行代码

Ctrl+D

打开最近操作的文件

Ctrl+E

快捷输入代码块

快捷使用一些常用代码模板,try catch等

Ctrl+Alt+T

查看当前类待实现接口

Ctrl+I

切换大小写

选中字段后使用Ctrl+Shift+U

快速补全代码

输入自定义的代码模板或自带的代码缩写后按tab自动补全

如psf

设置代码模板

 

上下移动一段代码

选中代码后按着shift+alt +上下方向键移动这段代码

选中字段

Ctrl+W,多次使用Ctrl+W可扩大选择范围

选中多行代码

同几行内可使用鼠标中键选中

选中不同部分的相同代码可以先选中一个字段,然后按住Alt+J往后依次选中相同代码。

鼠标中键

 

开发前配置

新建项目

首先新建项目

配置Git

Git使用之后再复盘

配置Git

配置好Git目录后为git设置账号邮箱(用于区分提交者)

Git配置账号邮箱

直接win+r -> cmd 打开命令行设置

导入插件

引入开发资料中的插件

  1. Android studio File->Settings..->Plugins -->install plugin from disk..导入 GsonFormat.jar ,

  2. 重启 android studio .

插件安装

默认配置好sdk与虚拟机

默认项目

打开虚拟机,默认配置为sdk8.0

虚拟机

引入依赖包

引入开发使用的依赖包

可用依赖

通常使用的有

  1.  

  2. banner 轮播图

  3. okhttp 网络请求

  4. MPAndroidChart 绘制图表

  5. Gson 格式化实例数据

  6. GsonFormatPlush 通过json生成实例的工具

  7. glide 图片加载库

     

    将需要的依赖jar,arr包放入项目下的libs文件夹后再app目录下的build.gradle中编写如下代码

    在dependencies闭包下添加aar

    引入依赖

    在android闭包下添加buildFeatures闭包并开启viewBinding开启控件绑定

     

这里构建工具版本过高会报错,修改为30.0.0即可

编写后截图

引入依赖包一般引入新版本,根据api需要还应引入一些依赖包

引入的依赖包

配置清单文件

然后配置清单文件就正式编写代码,这里需要添加上网络权限和根据要求设置

在manifest下与application同级处添加网络请求权限,点击label处的引用@string/app_name,使用快捷键ctrl+b可直接打开strings.xml文件来修改相应引用文字

如果设置了目标sdk版本大于28(9.0)还需要在application下设置运行使用明文流量(http)否则只能执行https请求,但软件默认sdk是8.0(26),使用明文请求的指令是默认为true的

指定sdk targetSdk为26

清单文件配置后

软件名称

软件名称

 

在主页面MainActivity添加键盘模式防止输入框顶起布局

清单

开发

编写辅助代码,布局

编写功能实现前需要使用的基类,通用布局等共用代码

布局相关

引入设计素材,基础样式,通用的布局代码,控件如toolbar等

引入设计素材

如常用的引导图,图标等

这里如果没有设计素材就只能从api中找到获取轮播图的接口了

这里我测试了服务器没有引导页的轮播图,只好从以前的设计素材中获取

导入素材

Toolbar

编写一个通用的toolbar,此处顺便从设计素材中引入了返回图标

代码预览

抽象基类 与工具类

开启ViewBinding后将一些控件绑定等页面常用事件封装到抽象基类如BaseActivity,BaseFragment,BaseAdapter分别是活动,碎片,适配器的基类,封装Adapter需要的ViewHolder,网络请求的OkHttps工具类以及存储常用常量的Const类

Const

封装需要使用的常量,如接口的服务器地址,用于初始化SP(轻量读写数据)的变量名,以及读写变量时的变量名,这里只需要读写TOKEN和判断初次登录的FIRST等变量, 顺便准备将TOKEN值存在这里使token只在登录登出时读写赋值

 

BaseActivity

*注:代码中包含一些可以优化的部分,比赛为了快速。一般不会特意处理不严重影响的问题

这里使用了lambda表达式,AS4.0在输入lambda表达式后会提示设置jdk版本

直接设置Source 和Target的java版本为1.8就可以

也可以手动在app下的build.gradle为android闭包添加如下代码

使用静态引用是引用需要引用对象内的静态变量,使用的时候可以省去前缀

也可以在build.gradle一开始就设置好

继承活动初始化时使用反射获取ViewBinding,设置布局,暴露初始化接口,初始化SP 按需求封装Toast, 读写SP,切换Fragment等方法 注意要暴露的方法和变量需要加上protected

BaseFragment

这里也可以保留了一个Activity引用,但一般不会这么做,因为其不同于requireActivity()返回的弱引用,这属于强引用使垃圾回收GC无法回收Activity从而容易崩溃,requireActivity()是判空返回底层类的Activity,不同于当前显示活动直接持有Activity (大概)

BaseViewHolder

 

BaseAdapter

使用BaseAdapter ViewHolder 的例子

 

Callbacks

一个实现Callback的抽象类,可以直接返回网络请求结果和相关实体类,因为获取class的反射代码都是一套,所以实际代码不会太多

 

OKHttps
EmptyActivity

用于占位给各种入口提供一个空白入口的Activity

 

跳转到EmptyActivity在intent中传入title即可

使用方法

 

样式

为styles添加冷启动开屏样式,将默认样式的parent修改为无actionbar样式

修改parent后复制一份设置windowBackground为第一张引导图即可

主样式继承MaterialComponent 是为了方便个人中心的按钮使用边框属性

 

 

引导页

新建引导页活动勾选启动类

清单

在清单内将启动类设置为SplashActivty,设置样式为SplashTheme

修改清单

布局

接着编写布局

代码

然后编写SplashActivity代码

逻辑为先继承BaseActivity,

获取sp存储token

判断sp是否初次登录

决定是显示引导页还是直接跳转主页

注意跳转后要关闭这个活动,并且初次登录值的修改和url的拼接将在主页执行

主页容器Activity

布局

先编写布局代码

简单的线性布局用于承载用于显示的碎片/片段

这里直接将显示的底部item用xml的方式写了进去

注意tabItem设置id的话ViewBinding会报错

然后编写java 界面,先新建几个空Fragment(因为不需要注册到清单中,可以新建一个Fragment之后复制粘贴几个,注意xml和java对应)

初始化Fragment

新建相应布局后直接新建Fragment类

代码

在Activity内新建Framgnet的实例设置为当前FrameLayout显示,tablayout添加点击事件切换Fragment

暴露一个切换到全部服务的方法给页面中间服务列表的更多服务使用

 

主页Fragment

布局

这里开始编写主页页面

从上至下一个搜索框,一个轮播图,一个服务列表,一个热门新闻列表,一个滑动的新闻分类tabLayout控制最底下的新闻列表

 

功能

需要实现新闻搜索(将输入内容传到另一个Activity显示匹配搜索结果的列表)

将获取的主页轮播图资源设置到轮播图,需要测试接口生成相应pojo类,轮播图点击事件需要相应的设置新闻详情页面可跳转

获取全部服务,设置相应的服务列表item,定义相应适配器

获取热门主题,设置相应新闻列表item,定义相应适配器

获取新闻分类,添加到分类tabLayout

获取默认分类的新闻,设置相应新闻列表item,定义相应适配器

新闻搜索

这里先不管新闻搜索列表页面具体实现,只生成一个空Activity用于跳转

默认的空界面布局

新建完Activity记得添加到清单中

清单

首页Fragment实现搜索

轮播图

先测试轮播图接口

测试接口

将返回json复制,使用alt+s 将json生成pojo类的字段和方法

pojo

跟上一步一样生成一个新闻详情页

调用get请求设置banner图片和点击事件

服务列表

引入需要显示自定义的更多服务图标

更多服务图标引入

使用RecyclerView需要定义显示的item布局,布局管理器,适配器和相应的bean pojo类

先定义item布局

 

测试接口生成pojo,编写适配器

在fragment内实例化适配器和布局管理器

热门主题

先编写item布局然后生成pojo实现适配器

Adapter

fragment获取新闻热点列表,设置适配器

新闻分类和列表

生成分类pojo,获取后添加到TabLayout中,将id设置为tab的tag方便点击时获取tab的id

 

复用旧的新闻pojo,编写新闻列表item布局

编写适配器

fragment内设置适配器,主页代码编写完成

 

主页Fragment 全部代码

 

新闻搜索完善

拥有新闻列表item和pojo类之后

在搜索Activity里获取传入搜索标题,获取新闻列表后进行比对返回结果列表复用列表适配器显示搜索结果

先在布局里加一个RecyclerView

直接先获取一个所有新闻列表,然后返回包含搜索文字的列表更新适配器

这里新闻详情可以顺手补完新闻fragment,fragment的实现会相对简单

新闻Fragment

布局

就是主页面底部一个tablayout+rv的形式

新闻详情比较麻烦,用上了webview显示内容,然后加上推荐新闻的rv,底部发表评论,以及底部查看评论列表

webView加载一个图片比较多的新闻时报了oom错误,换一个加载方式,但是另一个方式直接全部加载不了图片

 

功能

因为显示的状态文字不同,要求观看数和点赞数。这里基于复用的原则,直接给NewsAdapter加上一个type变量用于指明显示的状态文字

直接复制主页新闻的代码即可

新闻显示

先测试接口生成新闻详情pojo,然后在NewsDetail.Activity内获取传入的id,get请求获取新闻详情bean

加载内容到webView时还要注意设置url给内容中的图片链接

新闻推荐

复用改改参数就行

评论列表

服务器接口没写好,搁置了

评论

因为评论接口看不了,这里干脆不将评论内容post上去了,直接toast敷衍一下

完整详情页代码

 

全部服务Fragment

布局

这个主要麻烦在要做一个单选RV

这个搜索框比用SearchView方便,后续再写主页搜索应该会用这种形式来减少记忆负担

功能

测试服务分类接口生成pojo,在rowsBean 添加一个布尔值标识被点击

emm...新版好像没有服务分类接口,那简单设置成存到HashMap嵌套List根据serveType存储即可

首先在Serve pojo类添加isChecked 和区分服务的serviceCategory

这里item binding直接新建一个包含一个Tv的布局

 

单选适配器实现

然后新建适配器,

关键是暴露一个表示上一个点击item坐标的last 整型,一个为了省事用于回调点击事件的onclick runnable

然后通过Serve中新建的checked变量判断是否更改背景色,在点击时进行last坐标的更新,更改上一次点击的item和当前item

完整适配器代码

全部服务Fragment使用适配器

 

HashMap里装获取全部服务时手动分类的服务List

另用一个List存放每种服务的bean,这里还得新建一个全部服务的List和相应的bean 操作完之后就可以在网络请求内同步更新两个适配器

 

搜索实现

edit监听enter

这里有个坑点,清理完文本的时候会自动加上一个空格导致再次搜索匹配不上,只要加个trim把输入的前后空格清理一下就可以了

完整Fragment代码

 

个人中心Fragment

 

布局

主要是按钮边框通过MaterialCardView实现

效果

 

功能

首先页面需要判断是否登录,登录了则应该通过TOKEN获取到个人信息显示到首页

因为更新个人信息后会返回到fragment,所以需要在页面onResume方法中获取个人信息以实现实时更新请求

登录注册

通过TOKEN_VAL判断是否登录,进入页面时先从SP中重新赋值TOKEN判断是否登录,同理此处在onResume中获取

这里准备编写一个登录注册的页面,记得新建Activity后一定要在清单中确认添加了相应节点。可以一开始就确认好预计要使用的Activity,一口气建好并添加。以及结合限选的主题时记得检查清单文件有没有合并避免无法打开限选主题的界面

登录注册的界面可以提前写好多个输入框,这样可以使登录,注册,修改密码使用一个界面完成。

这里因为注册需要用户名,密码,电话号码和输入性别。所以这个页面需要多个输入框和一个单选框

一个tv用于切换注册登录,一个按钮用于提交

编写LoginActivity代码 为了区别登录注册两种状态和重置密码的状态,通过重置密码跳转时会传一个布尔值标识重置密码。否则则是默认登录界面,于是PerFragment个人中心暂时像这样子 注意token有过期的可能,onResume获取个人信息的时候应注意token过期,过期视为未登录

接下来实现登录界面的三种状态,先根据传入和点击tip tv切换页面状态再完善代码实现,因为id简朴的用了字典序,所以最好在注释内简单说明一下哪些ed的类型,默认显示哪些

封装批量控制编辑框显示,内容判空的方法

测试登录,注册和修改密码接口。新建通用返回结果pojo,token是为了在返回token的登录接口的返回共同使用而加上的

没有token的返回直接无视这个属性即可

完整LoginActivity

 

默认返回结果pojo

编写完页面切换逻辑加上请求即可,注意登录后应该关闭当前activity保存token

个人信息

因为这里文件上传接口测试失败,直接显示一个弹窗表示可以选择相册图片或拍摄就可以了

先为每一个按钮添加点击事件,且判断登录状态下才能打开

此处回到fragment会测试获取用户信息

测试接口生成bean然后onResume下通过token获取用户信息 顺便为所有按钮添加一个跳转页面

然后编写个人信息的界面布局

 

InfoActivity

进入Activity先获取信息设置上去,然后监听按钮点击判空输入,提交修改

 

提交反馈

用一个TextInputLayout做一个字数限制

直接监听按钮发个post请求

 

订单列表

因为没打算做智慧巴士啥的,这里直接显示一个包含两个item(已支付,未支付)的tabLayout敷衍一下

打包发布release

选择打包

-> Build -> Generate Signed Bundle / APK

选择打包APK

选择打包APK

 

 

选择CreateNew,选择存储位置,密码,和随便填一个校验

相关配置

返回页面

然后点Next一键打包,选择release并且勾选两个签名方案

选择

 

打包release包耗时比较久,至少预留半小时打包和测试

release/app-release.apk

提交前记得查看打包命名要求,这里默认改成SmartCity.apk

成果物

 

粤ICP备2022099830号-1