Android Studio实现志愿者系统

news/2024/11/1 17:31:58/

项目目录

  • 一、项目概述
  • 二、主要技术
  • 三、开发环境
  • 四、详细设计
    • 1、基础Activity
    • 2、活动信息
    • 3、成员信息
    • 4、百度地图
    • 5、Widget组件
  • 五、运行演示

一、项目概述

本系统采用MVC架构设计,SQLite数据表有用户表、成员表和活动表,有十多个Activity页面。打开应用,进入欢迎界面,3s后跳转登录界面,用户先注册账号,登录成功后进入主界面。主界面可以查看我的活动,修改和删除活动,还能发布活动。可以添加和删除成员、还能查看我的成员信息。可以查看和修改个人信息。底部导航栏和顶部菜单栏,菜单栏可以打开背景音乐、查询位置和查询时间。应用还制作了钟表显示的小组件,功能非常丰富。

二、主要技术

主要应用的技术如下:

Fragment碎片Service后台服务SharedPreferencesMediaPlayer
HandlerSQLiteDatabaseBundleRecyclerView
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() {@Overridepublic 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-dataandroid:name="com.baidu.lbsapi.API_KEY"android:value="@string/api_key" /><serviceandroid: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实现志愿者系统

说话有温度,与人交往才能有热度。


http://www.ppmy.cn/news/20195.html

相关文章

如何用Spring整合MyBatis和Junit

Spring整合MyBatis和Junit一. 整合MyBatis1. 目录&#xff1a;2. pom.xml&#xff1a;3. domain层&#xff1a;4. dao层&#xff1a;5. service层&#xff1a;AccountService接口类&#xff1a;AccountServiceImpl实现类&#xff1a;6. jdbc.properties配置文件&#xff1a;7. …

Day14 基于AOP的声明式事务控制

1 Spring 事务编程概述PlatformTransactionManager TransactionDefinition TransactionStatus2 搭建环境数据库准备一个账户表tb account;dao层准备一个AccountMapper&#xff0c;包括incrMoney和decrMoney两个方法;service层准备一个transferMoney方法&#xff0c;分别调用in…

2022年终总结-正月初七

这是毕业的第二年也是第二次写年终总结&#xff0c;元旦过后工作一直忙加上身体不舒服回家过年种种事情拖到现在。 在过去的一年中&#xff0c;爱情和事业都有一些进展。去了老丈人家、双方父母见面&#xff0c;陪小舅子打麻将&#xff0c;夏天在户外烤串等等。涨了工资&#…

Unicode编码

Unicode编码以上我们介绍了中文和西欧的字符与编码&#xff0c;但世界上还有很多其他国家的字符&#xff0c;每个国家的各种计算机厂商都对自己常用的字符进行编码&#xff0c;在编码的时候基本忽略了其他国家的字符和编码&#xff0c;甚至忽略了同一国家的其他计算机厂商&…

这些好用的办公软件分享给你

软件一&#xff1a;备忘录 现在大部分手机备忘录都提供语音记录功能&#xff0c;可以实时录音并转换成文本内容记录下来&#xff0c;使用起来还是比较方便的&#xff0c;但是要注意它支持转换的时长是有限制的哦&#xff01; 操作步骤&#xff1a;打开手机备忘录&#xff0c;…

Hadoop基础之《(5)—MapReduce概述》

一、什么是MapReduce MapReduce将计算过程分为两个阶段&#xff1a;Map和Reduce。 1、Map阶段并行处理输入数据。 2、Reduce阶段对map结果进行汇总。 二、结构图 三、HDFS、Yarn、MapReduce三者之间的调用关系 HDFS三台服务器&#xff0c;第一台上有DataNode和NameNode。第二…

Qt扫盲-Reentrant和线程安全

Reentrant和线程安全一、概述二、Reentrant三、线程安全四、Qt类的注意事项一、概述 在整个文档中&#xff0c; Reentrant 和 thread-safe 术语用于标记类和函数&#xff0c;指明如何在多线程应用程序中使用它们: 一个 thread-safe的函数可以从多个线程同时调用&#xff0c;即…

4729. 解密

Powered by:NEFU AB-IN Link 文章目录4729. 解密题意思路代码4729. 解密 题意 给定一个正整数 k, 有 k次询问&#xff0c;每次给定三个正整数 ni,ei,di&#xff0c;求两个正整数 pi,qi&#xff0c;使 nipiqi&#xff0c;eidi(pi−1)(qi−1)1 思路 通过数学推导可以推出 p q …