我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android实现志愿者系统详细步骤与代码

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android实现志愿者系统详细步骤与代码

一、项目概述

本系统采用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() {
      @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实现志愿者系统

到此这篇关于Android实现志愿者系统详细步骤与代码的文章就介绍到这了,更多相关Android志愿者系统内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android实现志愿者系统详细步骤与代码

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android实现志愿者系统详细步骤与代码

这篇文章主要介绍了Android实现志愿者系统,本系统采用MVC架构设计,SQLite数据表有用户表、成员表和活动表,有十多个Activity页面。打开应用,进入欢迎界面,3s后跳转登录界面,用户先注册账号,登录成功后进入主界面
2023-02-10

详解Android获取系统内核版本的方法与实现代码

Android获取系统内核版本的方法 这里主要实现获取Android Linux 内核的版本号,网上关于这类文章不是很多,这里记录下,希望能帮助到大家,实现代码:public static String get
2023-05-30

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录