基于Android Studio 实现通讯录—原创

目录

一、项目演示

二、开发环境

三、项目详情

四、项目完整源码


一、项目演示

基于Android Studio 实现通讯录---原创

二、开发环境

三、项目详情

1.启动页

这段代码是一个简单的Android应用程序启动活动(Activity),具体功能如下:

  1. **延迟进入登录页面:**
  • 在 `onCreate()` 方法中,使用 `Handler` 和 `Runnable` 实现了一个延迟执行的功能,延迟时间为3秒。

  • `runnable` 对象的 `run()` 方法调用了 `tomainActive()` 方法,在延迟结束后启动 `LoginRegisterActivity` 并关闭当前的 `StartActivity`。

  1. **计时器功能:**
  • 定义了一个内部类 `TimeCount`,继承自 `CountDownTimer`,用于执行一个四秒的倒计时操作,每隔一秒触发一次。

  • `onFinish()` 方法中,倒计时结束后移除了 `handler` 中的 `runnable` 对象,确保不会在倒计时结束后再次跳转到登录页面。

  1. **Activity 生命周期方法:**
  • `onCreate()` 方法中,设置了布局文件 `activity_start.xml` 作为界面显示内容,并启动了延迟执行和计时器。

  • `onDestroy()` 方法中未显示重写,但在 `toMainActive()` 方法中的 `finish()` 方法确保了在跳转完成后关闭当前 Activity。

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/start"
    tools:context=".Activity.StartActivity">

    <Button
        android:id="@+id/btn_skip"
        android:layout_width="70dp"
        android:layout_height="30dp"
        android:layout_marginTop="24dp"
        android:layout_marginEnd="16dp"
        android:background="@drawable/start_bg"
        android:text="跳过"
        android:textColor="#fff"
        android:textSize="12sp"
        android:textStyle="bold"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

2.登陆、注册

  1. 获取输入数据:从用户输入框中获取手机号和密码,检查"保存密码"复选框的状态。

  2. 保存或清除数据:

  • 如果复选框选中,则保存手机号、密码和复选框状态到 `SharedPreferences`。

  • 如果复选框未选中,则清空 `SharedPreferences` 中的数据。

  1. 检查输入:如果手机号或密码为空,弹出提示。

  2. 验证用户:检查手机号和密码是否匹配。

  3. 登录处理:

  • 成功:保存用户信息,跳转到主界面,显示成功消息。

  • 失败:显示错误消息。

java 复制代码
  private void login() {
        btnLogin.setOnClickListener(v -> {
            String phone = etUserPhone.getText().toString();
            String password = etUserPassword.getText().toString();
            boolean isSavePwdChecked = savePwdCheckBox.isChecked();
            if (TextUtils.isEmpty(phone)||TextUtils.isEmpty(password)){
                Toast.makeText(this, "请输入完整的信息!", Toast.LENGTH_SHORT).show();
                return;
            }
            boolean b = userHelper.validateUser(phone, password);
            if (b){
                Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                Toast.makeText(this, "登录成功!", Toast.LENGTH_SHORT).show();
                startActivity(intent);
                finish();
            }else {
                Toast.makeText(this, "登录失败,请检查手机号或密码是否正确!", Toast.LENGTH_SHORT).show();
            }
        });
    }
  1. 获取输入数据:从用户输入框中获取手机号、密码和确认密码。

  2. 非空验证:检查手机号、密码和确认密码是否为空。如果有为空的情况,弹出提示信息。

  3. 密码匹配验证:检查密码和确认密码是否一致。如果不一致,弹出提示信息。

  4. 用户注册:调用userHelper.addUser() 方法尝试将用户信息添加到数据库中(假设使用了 SQLite 数据库)。

  5. 注册结果处理:

  • 如果注册成功,显示"注册成功"消息并结束当前活动(即关闭注册界面)。

  • 如果注册失败(比如手机号已存在),显示"注册失败"消息提示用户更换手机号。

java 复制代码
private void register() {
        btnRegister.setOnClickListener(v -> {
            String phone = etUserPhone.getText().toString();
            String password = etUserPassword.getText().toString();
            String rpassword = etRuserPassword.getText().toString();
            if (TextUtils.isEmpty(phone) || TextUtils.isEmpty(password) || TextUtils.isEmpty(rpassword)) {
                Toast.makeText(RegisterActivity.this, "所有内容均不可为空!", Toast.LENGTH_SHORT).show();
                return;
            }
            if (!password.equals(rpassword)) {
                Toast.makeText(RegisterActivity.this, "两次密码不一致,请重新输入!", Toast.LENGTH_SHORT).show();
                return;
            }
            boolean b = userHelper.addUser(phone, password);
            if (b) {
                Toast.makeText(RegisterActivity.this, "注册成功!", Toast.LENGTH_SHORT).show();
                finish();
            } else {
                Toast.makeText(RegisterActivity.this, "注册失败,手机号已存在,请更换手机号!", Toast.LENGTH_SHORT).show();
            }
        });
    }

3.首页

  1. 排序联系人:
  • 按首字母排序,`#` 字母排在最后。
  1. 创建联系人列表:
  • 根据首字母分组联系人,添加分组标题和联系人条目。
  1. 更新视图:
  • 控制侧边栏和空状态显示。

  • 更新 ListView 的适配器。

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#F6F6F6"
    tools:context=".Fragment.HomeFragment">
    <!-- Add this in your fragment_home.xml -->

    <LinearLayout
        android:id="@+id/ll_kong"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:gravity="center"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="@+id/lv"
        app:layout_constraintEnd_toStartOf="@+id/sidebar_layout"
        app:layout_constraintStart_toStartOf="@+id/lv"
        app:layout_constraintTop_toTopOf="@+id/lv">

        <ImageView
            android:id="@+id/img_kong"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:src="@drawable/kong"
            android:visibility="visible" />

        <TextView
            android:id="@+id/textView11"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:gravity="center"
            android:text="暂无数据~"
            android:textColor="#000"
            android:textStyle="bold" />
    </LinearLayout>

    <View
        android:id="@+id/view5"
        android:layout_width="0dp"
        android:layout_height="1dp"
        android:layout_marginStart="2dp"
        android:layout_marginTop="2dp"
        android:layout_marginEnd="2dp"
        android:background="#2aa515"
        app:layout_constraintEnd_toEndOf="@+id/linearLayout7"
        app:layout_constraintStart_toStartOf="@+id/linearLayout7"
        app:layout_constraintTop_toBottomOf="@+id/linearLayout7" />

    <LinearLayout
        android:id="@+id/linearLayout9"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:orientation="horizontal"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <TextView
            android:id="@+id/textView10"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="联系人"
            android:textColor="#000"
            android:textSize="24sp"
            android:textStyle="bold" />

        <ImageView
            android:id="@+id/img_add"
            android:layout_width="30dp"
            android:layout_height="match_parent"
            android:src="@drawable/home_add" />
    </LinearLayout>

    <ListView
        android:id="@+id/lv"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="24dp"
        android:layout_marginEnd="8dp"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"
        android:scrollbars="none"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="@+id/linearLayout7"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="@+id/linearLayout7"
        app:layout_constraintTop_toBottomOf="@+id/linearLayout7"
        app:layout_constraintVertical_bias="0.0" />

    <LinearLayout
        android:id="@+id/linearLayout7"
        android:layout_width="0dp"
        android:layout_height="30dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="8dp"
        android:background="#F6F6F6"
        android:gravity="center"
        android:orientation="horizontal"
        android:padding="3dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/linearLayout9">

        <ImageView
            android:id="@+id/img_search"
            android:layout_width="25dp"
            android:layout_height="match_parent"
            android:src="@drawable/search" />

        <EditText
            android:id="@+id/et_content"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_weight="1"
            android:background="#F6F6F6"
            android:ems="10"
            android:gravity="center|left"
            android:hint="可按照姓、电话、分组查询"
            android:inputType="textPersonName"
            android:textSize="14sp" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/sidebar_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#F6F6F6"
        android:orientation="vertical"
        android:padding="4dp"
        app:layout_constraintBottom_toBottomOf="@+id/lv"
        app:layout_constraintEnd_toEndOf="@+id/lv"
        app:layout_constraintTop_toTopOf="@+id/lv" />
</androidx.constraintlayout.widget.ConstraintLayout>

4.添加页面、修改页面

  1. setupSpinner:
  • 设置一个下拉菜单(Spinner),从资源文件中读取选项,并创建一个映射关系以用于管理联系人分组(如同学、同事等)。
  1. setupUserPhone:
  • 从共享偏好中读取用户的电话号码。
  1. handleIntentData:
  • 根据 Intent 传递的 `addressbook_id` 决定是修改现有联系人还是添加新联系人。设置相应的界面元素(如标题和按钮)。
  1. loadContactData:
  • 如果是修改联系人,加载并显示联系人的数据(包括头像、姓名、电话和分组信息)。
  1. openImagePicker:
  • 启动图片选择器以允许用户选择头像图片。
  1. onActivityResult:
  • 处理图片选择的结果,将图片转换为 Base64 格式并显示在界面上。
  1. convertToBase64:
  • 将 Bitmap 图像转换为 Base64 字符串。
  1. addContact:
  • 添加新联系人到数据库中,调用 `validateInput` 进行输入验证,并根据操作结果显示相应的提示信息。
  1. modifyContact:
  • 修改现有联系人信息,调用 `validateInput` 进行输入验证,并根据操作结果显示相应的提示信息。
  1. validateInput:
  • 验证联系人姓名和手机号是否为空。
  1. showToast:
  • 显示操作成功或失败的提示信息。
  1. onRequestPermissionsResult:
  • 处理权限请求结果,如果权限被授权,打开图片选择器;否则显示权限被拒绝的提示。
XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#fff"
    tools:context=".Activity.AddActivity">

    <LinearLayout
        android:id="@+id/linearLayout4"
        android:layout_width="0dp"
        android:layout_height="40dp"
        android:background="#2aa515"
        android:gravity="center"
        android:orientation="horizontal"
        android:padding="10dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <ImageView
            android:id="@+id/img_back"
            android:layout_width="15dp"
            android:layout_height="match_parent"
            app:srcCompat="@drawable/back" />

        <TextView
            android:id="@+id/tv_title"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:text="新建联系人"
            android:textColor="#fff"
            android:textSize="18sp"
            android:textStyle="bold" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayout6"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="24dp"
        android:layout_marginEnd="16dp"
        android:orientation="vertical"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/linearLayout4">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:gravity="center"
            android:orientation="horizontal">

            <ImageView
                android:id="@+id/img_avatar"
                android:layout_width="80dp"
                android:layout_height="80dp"
                app:srcCompat="@drawable/add" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="40dp"
            android:orientation="horizontal">

            <TextView
                android:id="@+id/textView4"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:gravity="center"
                android:text="姓名:"
                android:textColor="#000"
                android:textSize="16sp"
                android:textStyle="bold" />

            <EditText
                android:id="@+id/et_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:ems="10"
                android:hint="请输入姓名"
                android:inputType="textPersonName"
                android:textSize="16sp" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:orientation="horizontal">

            <TextView
                android:id="@+id/textView8"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:gravity="center"
                android:text="电话:"
                android:textColor="#000"
                android:textSize="16sp"
                android:textStyle="bold" />

            <EditText
                android:id="@+id/et_phone"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:ems="10"
                android:hint="请输入电话"
                android:inputType="phone"
                android:textSize="16sp" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="30dp"
            android:orientation="horizontal">

            <TextView
                android:id="@+id/textView9"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:gravity="center"
                android:text="群组:"
                android:textColor="#000"
                android:textSize="16sp"
                android:textStyle="bold" />

            <Spinner
                android:id="@+id/spinner"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1" />

        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"></LinearLayout>
    </LinearLayout>

    <Button
        android:id="@+id/btn_add"
        android:layout_width="0dp"
        android:layout_height="30dp"
        android:background="@drawable/btn"
        android:text="立 即 新 建"
        android:textColor="#fff"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="@+id/linearLayout6"
        app:layout_constraintStart_toStartOf="@+id/linearLayout6"
        app:layout_constraintTop_toBottomOf="@+id/linearLayout6" />
</androidx.constraintlayout.widget.ConstraintLayout>

5.我的页面、修改页面

  1. 点击修改密码:跳转到 `ModifyActivity` 活动。

  2. 点击显示版本:弹出一个消息,显示当前软件版本。

  3. 点击退出登录:跳转到 `LoginActivity` 活动,并结束当前活动。

java 复制代码
  private void ll() {
        llModifypassword.setOnClickListener(v -> {
            Intent intent = new Intent(getActivity(), ModifyActivity.class);
            startActivity(intent);
        });
        llVersions.setOnClickListener(v -> {
            Toast.makeText(getActivity(), "当前软件版本:1.0.0", Toast.LENGTH_SHORT).show();
            return;
        });
        llQuit.setOnClickListener(v -> {
            Intent intent = new Intent(getActivity(), LoginActivity.class);
            startActivity(intent);
            getActivity().finish();
        });
    }
  1. 获取用户输入的手机号、旧密码和新密码。

  2. 检查输入是否完整,手机号是否正确,以及新旧密码是否相同。

  3. 如果检查通过,就尝试更新密码。

  4. 更新成功后,清除登录信息,显示成功提示,并跳转回登录界面。

  5. 如果更新失败,显示错误信息。

java 复制代码
    private void modify() {
        btnModify.setOnClickListener(v -> {
            // 获取输入框中的信息
            String userPhone = etPhone.getText().toString();
            String oldPassword = etOld.getText().toString();
            String newPassword = etNew.getText().toString();

            // 校验输入信息是否为空
            if (userPhone.isEmpty() || oldPassword.isEmpty() || newPassword.isEmpty()) {
                Toast.makeText(this, "请输入完整的信息!", Toast.LENGTH_SHORT).show();
                return;
            }

            // 校验手机号是否正确
            if (!userPhone.equals(phone)) {
                Toast.makeText(this, "手机号错误,请重新输入!", Toast.LENGTH_SHORT).show();
                return;
            }
            if (oldPassword.equals(newPassword)) {
                Toast.makeText(this, "旧密码不可与新密码相同!", Toast.LENGTH_SHORT).show();
                return;
            }

            // 更新密码
            boolean isUpdated = userHelper.updatePassword(userPhone, oldPassword, newPassword);
            if (isUpdated) {
                // 显示修改成功的提示
                Toast.makeText(this, "修改成功!", Toast.LENGTH_SHORT).show();
                // 跳转到登录界面
                Intent intent = new Intent(ModifyActivity.this, LoginActivity.class);
                startActivity(intent);
                finish(); // 结束当前活动
            } else {
                Toast.makeText(this, "手机号或密码错误!", Toast.LENGTH_SHORT).show();
            }
        });
    }

四、项目完整源码

👇👇👇👇👇快捷获取方式👇👇👇👇👇

相关推荐
潜龙95272 小时前
第3.2.3节 Android动态调用链路的获取
android·调用链路
追随远方2 小时前
Android平台FFmpeg音视频开发深度指南
android·ffmpeg·音视频
撰卢4 小时前
MySQL 1366 - Incorrect string value:错误
android·数据库·mysql
恋猫de小郭4 小时前
Flutter 合并 ‘dot-shorthands‘ 语法糖,Dart 开始支持交叉编译
android·flutter·ios
牛马程序小猿猴4 小时前
15.thinkphp的上传功能
android
林家凌宇5 小时前
Flutter 3.29.3 花屏问题记录
android·flutter·skia
时丶光5 小时前
Android 查看 Logcat (可纯手机方式 无需电脑)
android·logcat
血手人屠喵帕斯5 小时前
事务连接池
android·adb
恋猫de小郭6 小时前
React Native 前瞻式重大更新 Skia & WebGPU & ThreeJS,未来可期
android·javascript·flutter·react native·react.js·ios
一人一萧十只猫�7 小时前
MySQL 从入门到精通(三):日志管理详解 —— 从排错到恢复的核心利器
android·mysql·adb