Android实现志愿者系统详细步骤与代码
作者:振华OPPO 发布时间:2022-01-08 22:41:42
一、项目概述
本系统采用MVC架构设计,SQLite数据表有用户表、成员表和活动表,有十多个Activity页面。打开应用,进入欢迎界面,3s后跳转登录界面,用户先注册账号,登录成功后进入主界面。主界面可以查看我的活动,修改和删除活动,还能发布活动。可以添加和删除成员、还能查看我的成员信息。可以查看和修改个人信息。底部导航栏和顶部菜单栏,菜单栏可以打开背景音乐、查询位置和查询时间。应用还制作了钟表显示的小组件,功能非常丰富。
二、主要技术
主要应用的技术如下:
Fragment碎片 | Service后台服务 | SharedPreferences | MediaPlayer |
---|---|---|---|
Handler | SQLiteDatabase | Bundle | RecyclerView |
Thread多线程 | Menu菜单栏 | 百度地图 | Widget组件开发 |
本项目知识点还是很多的,涉及到Service后台服务,百度地图定位功能,Widget桌面组件开发等。
三、开发环境
开发环境依旧是在Android Studio4.2.1,只要你的AS是近两年从官网下载的,都是可以满足的。日期版本是比4.2.1高的。
四、详细设计
1、基础Activity
首先,讲下欢迎、注册和登录,这三者作为App不可或缺的内容,同时也是逻辑细节和UI设计最需要注意的地方,做完容易,做好不容易。做过这么多应用了,不同样式的登录界面也接触了20来种。本次注册登录还是很喜欢的风格,很丰富的提示信息,保证账号的唯一性。记住密码,方便用户,注册完也连带账号和密码一起传回来。Layout的Code过于简单,看下Design视图。
再来讲MainActivity,奠定应用基调的Activity,至关重要,你要将应用的所有功能呈现在这里,底部导航栏采用BottomNavigationView,顶部Menu菜单栏、导航栏以及主体部分都是系统功能。按钮都设置了渐变色的background,按下变色。导航栏有图标,后面的各个输入框都有图标。
MainActivity的代码很多,因为它负责了后台音乐、位置查询、活动的查看修改删除发布等页面跳转,查看删除添加成员的跳转,以及个人信息的修改等。这里就一起看下导航栏的 * 吧,和Onclick方法很相似,只能说接口方法好像都如此。
// 底部导航栏 *
bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.my_member:
Intent intentMember = new Intent(MainActivity.this, ViewMember.class);
startActivity(intentMember);
return true;
case R.id.release_activity:
Intent intentActivity = new Intent(MainActivity.this, ReleaseActivity.class);
startActivity(intentActivity);
return true;
case R.id.personal_information:
Intent intentPersonal = new Intent(MainActivity.this, PersonalActivity.class);
startActivity(intentPersonal);
return true;
}
return false;
}
});
2、活动信息
先看下Activity的Bean类的属性and方法。
// 我的活动实体类
public class MyActivity {
private String name;
private String number;
private String beginDate;
private String endDate;
public MyActivity() {
}
public MyActivity(String name, String number, String beginDate, String endDate) {
this.name = name;
this.number = number;
this.beginDate = beginDate;
this.endDate = endDate;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getBeginDate() {
return beginDate;
}
public void setBeginDate() {
this.beginDate = beginDate;
}
public String getEndDate() {
return endDate;
}
public void setEndDate() {
this.endDate = endDate;
}
}
再来看下数据库中Activity表,你会发现数据表的字段名就是Bean的属性名。
// 活动表建表语句
public static final String CREATE_MYACTIVITY = "create table MyActivity (" +
"name varchar(20) primary key," +
"number varchar(20)," +
"beginDate varchar(20)," +
"endDate varchar(20))";
建立好表后,在ActivityDao中写好对活动表的增删改查方法吧,后面只需要创建ActivityDao对象就可以操作活动表了,不需要每次都写一遍。
// 添加我的活动
public void insertMyActivity(MyActivity myActivity) {
// 创建ContentValues对象
ContentValues values = new ContentValues();
// 向该对象中插入键值对
values.put("name", myActivity.getName());
values.put("number", myActivity.getNumber());
values.put("beginDate", myActivity.getBeginDate());
values.put("endDate", myActivity.getEndDate());
// 通过insert()方法插入数据
sqLiteDatabase.insert(MyDBOpenHelper.TABLE_MYACTIVITY, null, values);
}
// 删除我的活动
public void deleteMyActivity(MyActivity myActivity) {
sqLiteDatabase.delete(MyDBOpenHelper.TABLE_MYACTIVITY, "name = ?", new String[]{myActivity.getName()});
}
// 修改我的活动
public void updateMyActivity(MyActivity myActivity) {
ContentValues values = new ContentValues();
values.put("name", myActivity.getName());
values.put("number", myActivity.getNumber());
values.put("beginDate", myActivity.getBeginDate());
values.put("endDate", myActivity.getEndDate());
sqLiteDatabase.update(MyDBOpenHelper.TABLE_MYACTIVITY, values, "name = ?", new String[]{myActivity.getName()});
}
// 查询我的活动
public ArrayList<MyActivity> queryMyActivity() {
ArrayList<MyActivity> arrayList = new ArrayList<>();
Cursor cursor = sqLiteDatabase.query(MyDBOpenHelper.TABLE_MYACTIVITY, null, null, null, null, null, null);
if (cursor.moveToFirst()) {
do {
String name = cursor.getString(cursor.getColumnIndex("name"));
String number = cursor.getString(cursor.getColumnIndex("number"));
String beginDate = cursor.getString(cursor.getColumnIndex("beginDate"));
String endDate = cursor.getString(cursor.getColumnIndex("endDate"));
MyActivity myActivity = new MyActivity(name, number, beginDate, endDate);
arrayList.add(myActivity);
} while (cursor.moveToNext());
}
cursor.close();
return arrayList;
}
// 根据名称查询我的活动
public MyActivity queryByName(String activityName) {
Cursor cursor = sqLiteDatabase.query(MyDBOpenHelper.TABLE_MYACTIVITY, null, null, null, null, null, null);
if (cursor.moveToFirst()) {
do {
// 遍历Cursor对象,取出数据比对
String name = cursor.getString(cursor.getColumnIndex("name"));
if (activityName.equals(name)) {
String number = cursor.getString(cursor.getColumnIndex("number"));
String beginDate = cursor.getString(cursor.getColumnIndex("beginDate"));
String endDate = cursor.getString(cursor.getColumnIndex("endDate"));
MyActivity myActivity = new MyActivity(name, number, beginDate, endDate);
cursor.close();
return myActivity;
}
} while (cursor.moveToNext());
}
cursor.close();
return null;
}
3、成员信息
先来看下成员类的属性和方法:
// 成员实体类
public class Member {
private String id;
private String name;
private String age;
private String phone;
public Member() {
}
public Member(String id, String name, String age, String phone) {
this.id = id;
this.name = name;
this.age = age;
this.phone = phone;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
再写建表语句,SQL语法熟练的话,这些都是基操了,没什么内容。
// 成员表建表语句
public static final String CREATE_MEMBER = "create table Member (" +
"id varchar(20) primary key," +
"name varchar(20)," +
"age varchar(20)," +
"phone varchar(20))";
最后,还是写MemberDao,对用户表的增删改查封装好。
// 添加我的成员
public void insertMember(Member member) {
// 创建ContentValues对象
ContentValues values = new ContentValues();
// 向该对象中插入键值对
values.put("id", member.getId());
values.put("name", member.getName());
values.put("age", member.getAge());
values.put("phone", member.getPhone());
// 通过insert()方法插入数据
sqLiteDatabase.insert(MyDBOpenHelper.TABLE_MEMBER, null, values);
}
// 删除我的成员
public void deleteMember(Member member) {
sqLiteDatabase.delete(MyDBOpenHelper.TABLE_MEMBER, "id = ?", new String[]{member.getId()});
}
// 修改我的成员
public void updateMember(Member member) {
ContentValues values = new ContentValues();
values.put("id", member.getId());
values.put("name", member.getName());
values.put("age", member.getAge());
values.put("phone", member.getPhone());
sqLiteDatabase.update(MyDBOpenHelper.TABLE_MEMBER, values, "id = ?", new String[]{member.getId()});
}
// 查询我的成员
public ArrayList<Member> queryMember() {
ArrayList<Member> arrayList = new ArrayList<>();
Cursor cursor = sqLiteDatabase.query(MyDBOpenHelper.TABLE_MEMBER, null, null, null, null, null, null);
if (cursor.moveToFirst()) {
do {
String id = cursor.getString(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String age = cursor.getString(cursor.getColumnIndex("age"));
String phone = cursor.getString(cursor.getColumnIndex("phone"));
Member member = new Member(id, name, age, phone);
arrayList.add(member);
} while (cursor.moveToNext());
}
cursor.close();
return arrayList;
}
// 根据编号查询成员
public Member queryById(String memberId) {
Cursor cursor = sqLiteDatabase.query(MyDBOpenHelper.TABLE_MEMBER, null, null, null, null, null, null);
if (cursor.moveToFirst()) {
do {
// 遍历Cursor对象,取出数据比对
String id = cursor.getString(cursor.getColumnIndex("id"));
if (memberId.equals(id)) {
String name = cursor.getString(cursor.getColumnIndex("name"));
String age = cursor.getString(cursor.getColumnIndex("age"));
String phone = cursor.getString(cursor.getColumnIndex("phone"));
Member member = new Member(id, name, age, phone);
cursor.close();
return member;
}
} while (cursor.moveToNext());
}
cursor.close();
return null;
}
4、百度地图
首先来看下我引入百度地图定位功能的过程。创建libs文件夹,然后拖拽BaiduLBS的jar包进去,然后Add as Library即可。
在AndroidManifest.xml中添加上meta-data标签和Service标签,一个是api_key,还有一个是location的服务。
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="@string/api_key" />
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" />
在MapActivity中定义并配置地图的参数信息,然后初始化当前位置并显示,因为模拟器的经纬度信息是不通过网络或者GPS获取的,所以绝大多数时候是不能用来使用百度地图的,我们的坐标也都是手动输入显示即可,想使用还是要用真机,况且大家也不是做什么科研项目,不需要到室外定位。
mapView = findViewById(R.id.map_view);
baiduMap = mapView.getMap();// 获取到地图
baiduMap.setMyLocationEnabled(true);
initMap(); // 设置地图放大的倍数
configureMap();// 设置定位的参数
initLocation();// 初始化位置
5、Widget组件
Widget组件是最近才学习的内容,发现平时手机应用对Widget用的很少,不过作为Android开发的知识,有就了解一下不是坏事。为系统制作了一个日期显示的Widget桌面组件,可以在活动列表中拖到模拟器桌面上。后面运行时候会演示打开组件的方法。
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialKeyguardLayout="@layout/my_app_widget"
android:initialLayout="@layout/my_app_widget"
android:minWidth="150dp"
android:minHeight="100dp"
android:previewImage="@drawable/example_appwidget_preview"
android:resizeMode="horizontal|vertical"
android:updatePeriodMillis="86400000"
android:widgetCategory="home_screen"></appwidget-provider>
长按桌面,跳出小组件,然后选择志愿者系统的组件,拖拽到桌面上即可。
五、运行演示
视频链接
Android Studio实现志愿者系统
来源:https://blog.csdn.net/qq_42257666/article/details/128511138


猜你喜欢
- @RequestLine的使用及配置@RequestLine与其它请求不同,只需要简单写请求方式和路径就能达到请求其它服务的目的。@Feig
- 如果有哪一个做程序员的小伙伴说自己没有遇到中文乱码问题,我是不愿意相信的。今天在做微信订阅号的智能回复时,又一时迷乱的跳进了中文乱码这个火坑
- Java goto语句妙用今天和朋友聊天的时候,无意间聊到了 goto 语句,但是在 Java 中, goto 是保留关键字,但是朋友说 J
- 本文为大家分享了自己写的一个Pager分页组件,WebForm,Mvc都适用,具体内容如下分页控件其实就是根据链接在页面间传递参数,因为我看
- 本文实例讲述了Java实现矩阵加减乘除及转制等运算功能。分享给大家供大家参考,具体如下:Java初学,编写矩阵预算程序,当做工具,以便以后写
- 一:前言最近老师布置了给多级菜单的作业,感觉蛮有意思的,可以提升自己的逻辑!下面我写个简易版的多级菜单,本人还是菜鸟,欢迎各位给予宝贵的建议
- 本文为大家分享了Android Studio使用USB真机调试的具体方法,供大家参考,具体内容如下以小米4为例,先将手机通过USB连接电脑,
- Android 登录处理简单实例今天整理一下之前在项目中写的关于某些界面需要登录判断处理。这里整理了一个简易的 Demo 模拟一下 登录情况
- 1.基本思路我现阶段的分页查询的实现是基于sql语句的。select * from user where id limit a, b构造出相
- Weblogic部署war找不到spring配置文件我有一个web工程在Tomcat7下部署没有问题,可是移植到Weblogic10上出现如
- Cookie和Session都是为了保持用户的访问状态,一方面为了方便业务实现,另一方面为了简化服务端的程序设计,提高访问性能。Cookie
- 基本思想基数排序(RadixSort)是在桶排序的基础上发展而来的,两种排序都是分配排序的高级实现。分配排序(DistributiveSor
- android studio 版本不同连接手机方式有细微的不同,主要方式相似。介绍主要分手机和电脑两部分介绍。一、手机部分1、手机端下载一个
- 因为课程需要,昨天好多同学在安装Android studio3.6.1后,无法构建,不知道什么原因,我的电脑上使用的是之前3.4版本的,可以
- 前言本文主要是将最近工作中遇到的一个问题进行总结分享,主要介绍的是如何让WebView中H5页面全屏播放视频。关于这个问题,做一下简单分析,
- 本文实例讲述了C++实现的O(n)复杂度内查找第K大数算法。分享给大家供大家参考,具体如下:题目:是在一组数组(数组元素为整数,可正可负可为
- 使用AOP的原因(AOP简介)我们知道,spring两大核心,IOC(控制反转)和AOP(切面),那为什么要使用AOP,AOP是什么呢,严格
- Java基本概念JDK包含了不少Java开发相关命令。如,javac、java、javap、javaw、javadoc。虽然现在的Java开
- 页面拖动到最后一页 再向下滑动回复到 第一页,第一页向前滑动回到 最后一页同时,底部红色小圆点随着页面的滑动距离比例随时改变位置布局:<
- 发现问题最近在项目中刚刚修改一个功能,代码正准备验证,启动Idea的debug模式,运行项目,发现启动失败,查看日志发现定时任务被重复执行,