欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 锐评 > 基于Android Studio 实现通讯录—原创

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

2025/5/19 2:51:48 来源:https://blog.csdn.net/qq_29823791/article/details/141729058  浏览:    关键词:基于Android Studio 实现通讯录—原创

目录

一、项目演示

二、开发环境

三、项目详情

四、项目完整源码


一、项目演示

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

二、开发环境

三、项目详情

1.启动页

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

1. **延迟进入登录页面:**
   - 在 `onCreate()` 方法中,使用 `Handler` 和 `Runnable` 实现了一个延迟执行的功能,延迟时间为3秒。
   - `runnable` 对象的 `run()` 方法调用了 `tomainActive()` 方法,在延迟结束后启动 `LoginRegisterActivity` 并关闭当前的 `StartActivity`。

2. **计时器功能:**
   - 定义了一个内部类 `TimeCount`,继承自 `CountDownTimer`,用于执行一个四秒的倒计时操作,每隔一秒触发一次。
   - `onFinish()` 方法中,倒计时结束后移除了 `handler` 中的 `runnable` 对象,确保不会在倒计时结束后再次跳转到登录页面。

3. **Activity 生命周期方法:**
   - `onCreate()` 方法中,设置了布局文件 `activity_start.xml` 作为界面显示内容,并启动了延迟执行和计时器。
   - `onDestroy()` 方法中未显示重写,但在 `toMainActive()` 方法中的 `finish()` 方法确保了在跳转完成后关闭当前 Activity。

<?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"><Buttonandroid: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` 中的数据。
3. 检查输入:如果手机号或密码为空,弹出提示。
4. 验证用户:检查手机号和密码是否匹配。
5. 登录处理:
   - 成功:保存用户信息,跳转到主界面,显示成功消息。
   - 失败:显示错误消息。

  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. 注册结果处理:
   - 如果注册成功,显示“注册成功”消息并结束当前活动(即关闭注册界面)。
   - 如果注册失败(比如手机号已存在),显示“注册失败”消息提示用户更换手机号。 

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. 排序联系人:
   - 按首字母排序,`#` 字母排在最后。
2. 创建联系人列表:
   - 根据首字母分组联系人,添加分组标题和联系人条目。
3. 更新视图:
   - 控制侧边栏和空状态显示。
   - 更新 ListView 的适配器。 

<?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 --><LinearLayoutandroid: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"><ImageViewandroid:id="@+id/img_kong"android:layout_width="match_parent"android:layout_height="200dp"android:src="@drawable/kong"android:visibility="visible" /><TextViewandroid: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><Viewandroid: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" /><LinearLayoutandroid: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"><TextViewandroid: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" /><ImageViewandroid:id="@+id/img_add"android:layout_width="30dp"android:layout_height="match_parent"android:src="@drawable/home_add" /></LinearLayout><ListViewandroid: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" /><LinearLayoutandroid: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"><ImageViewandroid:id="@+id/img_search"android:layout_width="25dp"android:layout_height="match_parent"android:src="@drawable/search" /><EditTextandroid: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><LinearLayoutandroid: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),从资源文件中读取选项,并创建一个映射关系以用于管理联系人分组(如同学、同事等)。

2. setupUserPhone:
   - 从共享偏好中读取用户的电话号码。

3. handleIntentData:
   - 根据 Intent 传递的 `addressbook_id` 决定是修改现有联系人还是添加新联系人。设置相应的界面元素(如标题和按钮)。

4. loadContactData:
   - 如果是修改联系人,加载并显示联系人的数据(包括头像、姓名、电话和分组信息)。

5. openImagePicker:
   - 启动图片选择器以允许用户选择头像图片。

6. onActivityResult:
   - 处理图片选择的结果,将图片转换为 Base64 格式并显示在界面上。

7. convertToBase64:
   - 将 Bitmap 图像转换为 Base64 字符串。

8. addContact:
   - 添加新联系人到数据库中,调用 `validateInput` 进行输入验证,并根据操作结果显示相应的提示信息。

9. modifyContact:
   - 修改现有联系人信息,调用 `validateInput` 进行输入验证,并根据操作结果显示相应的提示信息。

10. validateInput:
    - 验证联系人姓名和手机号是否为空。

11. showToast:
    - 显示操作成功或失败的提示信息。

12. onRequestPermissionsResult:
    - 处理权限请求结果,如果权限被授权,打开图片选择器;否则显示权限被拒绝的提示。

<?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"><LinearLayoutandroid: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"><ImageViewandroid:id="@+id/img_back"android:layout_width="15dp"android:layout_height="match_parent"app:srcCompat="@drawable/back" /><TextViewandroid: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><LinearLayoutandroid: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"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:gravity="center"android:orientation="horizontal"><ImageViewandroid:id="@+id/img_avatar"android:layout_width="80dp"android:layout_height="80dp"app:srcCompat="@drawable/add" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="40dp"android:orientation="horizontal"><TextViewandroid: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" /><EditTextandroid: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><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:orientation="horizontal"><TextViewandroid: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" /><EditTextandroid: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><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="30dp"android:orientation="horizontal"><TextViewandroid: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" /><Spinnerandroid:id="@+id/spinner"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"></LinearLayout></LinearLayout><Buttonandroid: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` 活动,并结束当前活动。

  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. 如果更新失败,显示错误信息。 

    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();}});}

四、项目完整源码

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词