基于Android Studio 多功能记事本-MySQL版

news2024/11/14 11:21:38

目录

一、项目演示

二、开发环境

三、项目详情

四、项目完整源码


一、项目演示

基于Android Studio 多功能记事本--MySQL版

二、开发环境

三、项目详情

1.启动页

这段代码主要实现了以下功能:

1. **延迟跳转**:在 `StartActivity` 中,使用 `Handler` 的 `postDelayed` 方法延迟三秒后执行 `runnable`,跳转到 `MainActivity`。

2. **计时器**:使用 `CountDownTimer` 初始化一个四秒倒计时的计时器,每秒触发一次 `onTick` 方法,但不做任何操作。计时器结束时,会移除 `runnable`,确保跳转到 `MainActivity`。

总的来说,该代码在 `StartActivity` 启动后,会等待三秒后跳转到 `MainActivity`,同时设置了一个四秒的计时器来管理跳转的时机。

<?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.StartActivity">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/logo" />
</androidx.constraintlayout.widget.ConstraintLayout>

2.登陆、注册

 private void login() {
        btnLogin.setOnClickListener(v -> {
            String phone = etPhone.getText().toString();
            String password = etPassword.getText().toString();
            if (phone.isEmpty() || password.isEmpty()) {
                Toast.makeText(this, "请输入完整的信息!", Toast.LENGTH_SHORT).show();
                return;
            }
            executorService.execute(() -> {
                boolean success = userDao.verifyUser(phone, password);
                runOnUiThread(() -> {
                    if (success) {
                        SharedPreferences sharedPreferences = getSharedPreferences("User", Context.MODE_PRIVATE);
                        SharedPreferences.Editor editor = sharedPreferences.edit();
                        editor.putString("phone", phone);
                        editor.apply();

                        Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                        Toast.makeText(LoginActivity.this, "登录成功!", Toast.LENGTH_SHORT).show();
                        startActivity(intent);
                        finish();
                    } else {
                        Toast.makeText(LoginActivity.this, "登录失败,请联系客服!", Toast.LENGTH_SHORT).show();
                    }
                });
            });
        });
    }

这段代码实现了登录功能,主要包括以下几个步骤:

1. **设置点击事件**:为登录按钮 `btnLogin` 设置点击事件监听器。

2. **获取输入信息**:从输入框中获取手机号码 (`etPhone`) 和密码 (`etPassword`)。

3. **信息校验**:检查手机号码和密码是否为空。如果任一为空,显示提示信息“请输入完整的信息!”并退出方法。

4. **后台验证**:
   - 使用 `executorService` 在后台线程中执行用户验证。
   - 调用 `userDao.verifyUser(phone, password)` 方法验证用户的手机号码和密码。

5. **更新UI**:
   - 在主线程中处理验证结果:
     - 如果验证成功,保存用户的手机号码到 `SharedPreferences` 中,并启动 `MainActivity`。显示“登录成功!”的提示消息,然后关闭当前 `LoginActivity`。
     - 如果验证失败,显示“登录失败,请联系客服!”的提示消息。

总结来说,这段代码实现了在用户点击登录按钮后,验证用户的手机号码和密码,并根据验证结果进行相应的提示和页面跳转。

    private void register() {
        btnRegister.setOnClickListener(v -> {
            String phone = etPhone.getText().toString();
            String name = etUserName.getText().toString();
            String password = etPassword.getText().toString();
            String rpassword = rPasswordEdittext.getText().toString();

            if (phone.isEmpty() || name.isEmpty() || password.isEmpty() || rpassword.isEmpty()) {
                Toast.makeText(this, "请确保所有内容都不为空!", Toast.LENGTH_SHORT).show();
                return;
            }

            if (!password.equals(rpassword)) {
                Toast.makeText(this, "两次密码不一致,请重新输入!", Toast.LENGTH_SHORT).show();
                return;
            }

            // 检查密码长度
            if (password.length() < 6 || password.length() > 16) {
                Toast.makeText(this, "密码长度必须在 6 到 16 位之间!", Toast.LENGTH_SHORT).show();
                return;
            }


            // 创建线程池并执行注册操作
            executorService.execute(() -> {
                boolean success = userDao.addUser(phone, name, password);
                runOnUiThread(() -> {
                    if (success) {
                        Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
                        Toast.makeText(RegisterActivity.this, "注册成功!", Toast.LENGTH_SHORT).show();
                        startActivity(intent);
                        finish();
                    } else {
                        Toast.makeText(RegisterActivity.this, "注册失败,请联系客服!", Toast.LENGTH_SHORT).show();
                    }
                });
            });

        });
    }

这段代码实现了用户注册功能,主要包括以下几个步骤:

1. **设置点击事件**:为注册按钮 `btnRegister` 设置点击事件监听器。

2. **获取输入信息**:从输入框中获取手机号码 (`etPhone`)、用户名 (`etUserName`)、密码 (`etPassword`)、和确认密码 (`rPasswordEdittext`)。

3. **信息校验**:
   - 检查所有输入项是否为空。如果有为空项,显示“请确保所有内容都不为空!”的提示信息并退出方法。
   - 检查密码和确认密码是否一致。如果不一致,显示“两次密码不一致,请重新输入!”的提示信息并退出方法。
   - 检查密码长度是否在 6 到 16 位之间。如果不符合要求,显示“密码长度必须在 6 到 16 位之间!”的提示信息并退出方法。

4. **后台注册**:
   - 使用 `executorService` 在后台线程中执行用户注册操作,通过调用 `userDao.addUser(phone, name, password)` 方法来注册用户。

5. **更新UI**:
   - 在主线程中处理注册结果:
     - 如果注册成功,启动 `LoginActivity` 并显示“注册成功!”的提示消息,然后关闭当前 `RegisterActivity`。
     - 如果注册失败,显示“注册失败,请联系客服!”的提示消息。

总结来说,这段代码实现了用户在点击注册按钮后进行数据校验,并在后台进行注册操作,根据操作结果显示相应的提示并处理页面跳转。

3.笔记页、添加修改页

    private void show() {
        // 创建线程池并执行注册操作
        executor.execute(() -> {
            List<NoteBean> allNotesByUserPhone = noteDao.getAllNotesByUserPhone(phone);
            if (allNotesByUserPhone != null && !allNotesByUserPhone.isEmpty()) {
                // 对笔记列表进行排序
                Collections.sort(allNotesByUserPhone, new Comparator<NoteBean>() {
                    @Override
                    public int compare(NoteBean note1, NoteBean note2) {
                        SimpleDateFormat sdfFull = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
                        try {
                            Date date1 = sdfFull.parse(note1.getTime());
                            Date date2 = sdfFull.parse(note2.getTime());
                            if (date1 != null && date2 != null) {
                                return date2.compareTo(date1); // 按时间降序排序
                            }
                        } catch (ParseException e) {
                            e.printStackTrace();
                        }
                        return 0;
                    }
                });
            }

            getActivity().runOnUiThread(() -> {
                if (allNotesByUserPhone != null && !allNotesByUserPhone.isEmpty()) {
                    // 隐藏 TextView,显示 ListView
                    tvShow.setVisibility(View.GONE);
                    lv.setVisibility(View.VISIBLE);
                    // 创建适配器并设置到 ListView
                    NoteAdapter adapter = new NoteAdapter(getActivity(), allNotesByUserPhone);
                    lv.setAdapter(adapter);
                } else {
                    // 显示 TextView,隐藏 ListView
                    tvShow.setVisibility(View.VISIBLE);
                    lv.setVisibility(View.GONE);
                }
            });
        });
    }

这段代码实现了以下功能:

1. 从后台线程中获取用户的所有笔记。
2. 按笔记时间进行降序排序。
3. 在主线程中根据笔记列表是否为空更新UI:
   - 如果笔记存在,隐藏 `TextView` 并显示 `ListView`,将笔记显示在 `ListView` 中。
   - 如果笔记为空,显示 `TextView` 并隐藏 `ListView`。

1. **获取和处理 Note ID**:
   - 从 `Intent` 中获取 `note_id`。
   - 根据 `note_id` 判断是新建笔记还是编辑已有笔记。

2. **新建笔记功能**:
   - 当 `noteId` 为 -1 时,执行新建笔记的操作。
   - 从用户输入中获取标题、内容、字体颜色、字体大小等信息。
   - 格式化当前时间。
   - 如果标题或内容为空,显示提示信息。
   - 使用后台线程将笔记数据保存到数据库。
   - 保存成功后显示提示信息并关闭当前界面。

3. **编辑笔记功能**:
   - 当 `noteId` 有效时,加载并显示对应的笔记内容。
   - 从数据库中获取笔记信息,并更新到界面上。
   - 处理图片显示:将图片从 Base64 解码并显示,或隐藏图片视图。
   - 设置保存按钮的点击事件,用于更新笔记信息。
   - 更新成功后重新加载笔记数据,确保图片也更新,然后显示成功提示信息并关闭当前界面。

4. **异常处理**:
   - 处理图片解码和显示中的异常情况,确保应用稳定运行。

<?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="#F5F5F5"
    tools:context=".Activity.NoteActivity">

    <LinearLayout
        android:id="@+id/linearLayout4"
        android:layout_width="0dp"
        android:layout_height="40dp"
        android:gravity="center|left"
        android:orientation="horizontal"
        android:padding="5dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <ImageView
            android:id="@+id/img_back"
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:layout_marginLeft="10dp"
            app:srcCompat="@drawable/back" />

        <ImageView
            android:id="@+id/img_save"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            app:srcCompat="@drawable/save" />
    </LinearLayout>

    <View
        android:id="@+id/view10"
        android:layout_width="0dp"
        android:layout_height="1dp"
        android:background="#ccc"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/linearLayout4" />

    <ScrollView
        android:id="@+id/scrollView3"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:scrollbars="none"
        app:layout_constraintBottom_toTopOf="@+id/linearLayout7"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/view10"
        app:layout_constraintVertical_bias="1.0">

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

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="8dp"
                android:layout_marginTop="8dp"
                android:layout_marginEnd="8dp"
                android:layout_marginBottom="8dp"
                android:orientation="vertical"
                android:padding="5dp">

                <EditText
                    android:id="@+id/et_title"
                    android:layout_width="match_parent"
                    android:layout_height="40dp"
                    android:background="#F5F5F5"
                    android:ems="10"
                    android:hint="点击输入标题"
                    android:inputType="textPersonName"
                    android:padding="4dp"
                    android:textColor="#000"
                    android:textColorHint="#9A9898"
                    android:textSize="18sp"
                    android:textStyle="bold" />

                <EditText
                    android:id="@+id/et_content"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="10dp"
                    android:background="#F5F5F5"
                    android:ems="10"
                    android:gravity="top|left"
                    android:hint="开始你的书写吧~"
                    android:inputType="textMultiLine"
                    android:padding="10dp"
                    android:textColor="#000"
                    android:textSize="14sp"
                    android:textStyle="bold" />

                <ImageView
                    android:id="@+id/img"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="10dp"
                    android:visibility="gone"
                    tools:srcCompat="@tools:sample/avatars" />
            </LinearLayout>
        </LinearLayout>
    </ScrollView>

    <View
        android:id="@+id/view11"
        android:layout_width="0dp"
        android:layout_height="1dp"
        android:layout_marginBottom="2dp"
        android:background="#ccc"
        app:layout_constraintBottom_toBottomOf="@+id/scrollView3"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <LinearLayout
        android:id="@+id/linearLayout7"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="2dp"
        android:orientation="horizontal"
        android:padding="4dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent">

        <ImageView
            android:id="@+id/img_add"
            android:layout_width="match_parent"
            android:layout_height="25dp"
            android:layout_weight="1"
            app:srcCompat="@drawable/note_add_img" />

        <ImageView
            android:id="@+id/img_size"
            android:layout_width="match_parent"
            android:layout_height="25dp"
            android:layout_weight="1"
            app:srcCompat="@drawable/note_size" />

        <ImageView
            android:id="@+id/img_color"
            android:layout_width="match_parent"
            android:layout_height="25dp"
            android:layout_weight="1"
            app:srcCompat="@drawable/note_color" />



    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

4.待办事项

private void loadData() {
        executor.execute(() -> {
            List<AgentMattersBean> unfinishedData = agentMattersDao.getAllByUserPhoneAndStatus(phone, "未完成");
            List<AgentMattersBean> finishedData = agentMattersDao.getAllByUserPhoneAndStatus(phone, "已完成");

            int unfinishedCount = agentMattersDao.getCountByUserPhoneAndStatus(phone, "未完成");
            int finishedCount = agentMattersDao.getCountByUserPhoneAndStatus(phone, "已完成");

            // 对获取的数据进行倒序
            Collections.reverse(unfinishedData);
            Collections.reverse(finishedData);

            getActivity().runOnUiThread(() -> updateUI(unfinishedData, finishedData, unfinishedCount, finishedCount));
        });
    }

    private void updateUI(List<AgentMattersBean> unfinishedData, List<AgentMattersBean> finishedData, int unfinishedCount, int finishedCount) {
        // 更新未完成列表视图
        if (unfinishedData.isEmpty()) {
            llUnfinished.setVisibility(View.GONE);
            lvUnfinished.setAdapter(null); // 清空 ListView
        } else {
            llUnfinished.setVisibility(View.VISIBLE);
            AgentMattersAdapter unfinishedAdapter = new AgentMattersAdapter(getActivity(), unfinishedData, this);
            lvUnfinished.setAdapter(unfinishedAdapter);
            unfinishedAdapter.notifyDataSetChanged(); // 确保 Adapter 刷新
        }

        // 更新已完成列表视图
        if (finishedData.isEmpty()) {
            llFinish.setVisibility(View.GONE);
            lvFinish.setAdapter(null); // 清空 ListView
        } else {
            llFinish.setVisibility(View.VISIBLE);
            AgentMattersAdapter finishedAdapter = new AgentMattersAdapter(getActivity(), finishedData, this);
            lvFinish.setAdapter(finishedAdapter);
            finishedAdapter.notifyDataSetChanged(); // 确保 Adapter 刷新
        }

        // 更新计数和标题
        tv1.setText(unfinishedCount > 0 ? "未完成" : "");
        tvUnfinished.setText(unfinishedCount > 0 ? unfinishedCount + "项" : "");
        tv2.setText(finishedCount > 0 ? "已完成" : "");
        tvFinish.setText(finishedCount > 0 ? finishedCount + "项" : "");

        // 显示或隐藏信息视图
        tvShow.setVisibility(unfinishedCount == 0 && finishedCount == 0 ? View.VISIBLE : View.GONE);
    }

这个方法的功能点总结如下:

1. **加载数据**:
   - 在后台线程中,通过 `agentMattersDao` 从数据库中获取未完成和已完成的事务数据。
   - 同时获取未完成和已完成事务的数量。
   - 对获取的数据进行倒序排列。

2. **更新用户界面**:
   - 在主线程中执行 UI 更新操作。
   - **未完成事务**:
     - 如果未完成事务数据为空,隐藏相关视图并清空 `ListView`。
     - 如果有未完成事务,显示相关视图,并使用 `AgentMattersAdapter` 更新 `ListView`,确保适配器刷新。
   - **已完成事务**:
     - 如果已完成事务数据为空,隐藏相关视图并清空 `ListView`。
     - 如果有已完成事务,显示相关视图,并使用 `AgentMattersAdapter` 更新 `ListView`,确保适配器刷新。
   - 更新计数和标题:
     - 设置未完成和已完成事务的数量及其显示的文本。
   - 显示或隐藏提示信息视图:
     - 当未完成和已完成事务数量都为 0 时,显示提示信息视图;否则隐藏。

5.心情日记页、添加修改页

 private void show() {
        // 创建线程池并执行注册操作
        executor.execute(() -> {
            List<DiaryBean> diaryBeans = diaryDao.getAllDiariesByUserPhone(phone);
            getActivity().runOnUiThread(() -> {
                if (diaryBeans != null && !diaryBeans.isEmpty()) {
                    // 排序 diaryBeans 列表
                    Collections.sort(diaryBeans, new Comparator<DiaryBean>() {
                        @Override
                        public int compare(DiaryBean d1, DiaryBean d2) {
                            try {
                                SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy年MM月dd日", Locale.CHINA);
                                Date date1 = inputFormat.parse(d1.getTime());
                                Date date2 = inputFormat.parse(d2.getTime());
                                if (date1 != null && date2 != null) {
                                    // 反转 compareTo 的结果以实现降序排序
                                    return date2.compareTo(date1);
                                }
                            } catch (ParseException e) {
                                e.printStackTrace();
                            }
                            return 0;
                        }
                    });
                    // 隐藏 TextView,显示 ListView
                    tvShow.setVisibility(View.GONE);
                    lv.setVisibility(View.VISIBLE);

                    // 创建适配器并设置到 ListView
                    DiaryAdapter adapter = new DiaryAdapter(getActivity(), diaryBeans);
                    lv.setAdapter(adapter);
                } else {
                    // 显示 TextView,隐藏 ListView
                    tvShow.setVisibility(View.VISIBLE);
                    lv.setVisibility(View.GONE);
                }
            });
        });
    }

    private void add() {
        imgAdd.setOnClickListener(v -> {
            if (TextUtils.isEmpty(phone)) {
                Toast.makeText(getActivity(), "请先登录在进行操作!", Toast.LENGTH_SHORT).show();
            } else {
                // 获取当前日期
                Calendar calendar = Calendar.getInstance();
                int year = calendar.get(Calendar.YEAR);
                int month = calendar.get(Calendar.MONTH);
                int day = calendar.get(Calendar.DAY_OF_MONTH);

                // 创建 DatePickerDialog
                DatePickerDialog datePickerDialog = new DatePickerDialog(
                        getActivity(),
                        (view, selectedYear, selectedMonth, selectedDay) -> {
                            // 格式化选择的日期
                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日", Locale.getDefault());
                            Calendar selectedDate = Calendar.getInstance();
                            selectedDate.set(selectedYear, selectedMonth, selectedDay);
                            String formattedDate = sdf.format(selectedDate.getTime());

                            // 创建 Intent 跳转到 DiaryActivity
                            Intent intent = new Intent(getActivity(), DiaryActivity.class);
                            intent.putExtra("date", formattedDate);
                            startActivity(intent);
                        },
                        year,
                        month,
                        day
                );
                // 显示 DatePickerDialog
                datePickerDialog.show();
            }
        });
    }

这个代码的功能点总结如下:

1. **显示日记数据 (`show` 方法)**:
   - 在后台线程中获取用户的所有日记数据。
   - 如果日记数据不为空:
     - 按日期降序对日记数据进行排序。
     - 隐藏提示 `TextView` 并显示 `ListView`。
     - 创建并设置适配器以显示日记数据。
   - 如果日记数据为空:
     - 显示提示 `TextView` 并隐藏 `ListView`。

2. **添加新日记 (`add` 方法)**:
   - 为添加按钮设置点击事件监听器。
   - 如果用户未登录,显示提示信息。
   - 如果用户已登录:
     - 显示 `DatePickerDialog` 让用户选择日期。
     - 格式化选择的日期并创建 `Intent` 跳转到 `DiaryActivity`,传递所选日期。

6.我的页面、修改密码、用户名

 private void modify() {
        // 获取传递过来的信息类型(密码或用户名)
        String information = getIntent().getStringExtra("information");

        if (information != null) {
            // 根据信息类型设置界面
            if (information.equals("password")) {
                // 如果信息类型是"password",则设置密码相关的提示文本
                etNew.setHint("请输入新密码(6-16位)");
                etRnew.setHint("请再次输入新密码(6-16位)");
                tvTitle.setText("修改用户密码");

                // 设置修改按钮的点击事件
                btnModify.setOnClickListener(v -> {
                    // 获取输入的手机号、新密码和确认密码
                    String etPhone = this.etPhone.getText().toString();
                    String newInformation = etNew.getText().toString();
                    String rnewInformation = etRnew.getText().toString();

                    // 检查手机号是否为空
                    if (etPhone.isEmpty()) {
                        Toast.makeText(this, "手机号不能为空!", Toast.LENGTH_SHORT).show();
                        return;
                    }

                    // 检查输入的手机号是否与当前用户手机号一致
                    if (!etPhone.equals(phone)) {
                        Toast.makeText(this, "请检查手机号是否一致!", Toast.LENGTH_SHORT).show();
                        return;
                    }

                    // 检查新密码长度是否符合要求
                    if (newInformation.length() < 6 || newInformation.length() > 16) {
                        Toast.makeText(this, "密码长度必须在 6 到 16 位之间!", Toast.LENGTH_SHORT).show();
                        return;
                    }

                    // 检查新密码和确认密码是否一致
                    if (!newInformation.equals(rnewInformation)) {
                        Toast.makeText(this, "新密码与确认密码不一致!", Toast.LENGTH_SHORT).show();
                        return;
                    }

                    // 使用线程池异步执行密码更新操作
                    executorService.execute(() -> {
                        boolean success = userDao.updateUserPasswordByPhone(phone, newInformation);

                        runOnUiThread(() -> {
                            if (success) {
                                // 清除SharedPreferences中的用户数据
                                SharedPreferences sharedPreferences = getSharedPreferences("User", Context.MODE_PRIVATE);
                                SharedPreferences.Editor editor = sharedPreferences.edit();
                                editor.clear();
                                editor.apply();

                                // 显示修改成功消息并跳转到主界面
                                Toast.makeText(this, "修改成功,请重新登录!", Toast.LENGTH_SHORT).show();
                                Intent intent = new Intent(ModifyInformationActivity.this, MainActivity.class);
                                intent.putExtra("state", "mine");
                                startActivity(intent);
                                finish();
                            } else {
                                Toast.makeText(this, "修改失败,请联系管理员!", Toast.LENGTH_SHORT).show();
                            }
                        });
                    });
                });

            } else if (information.equals("userName")) {
                // 如果信息类型是"userName",则设置用户名相关的提示文本
                etNew.setHint("请输入新用户名");
                etRnew.setHint("请再次输入新用户名");
                tvTitle.setText("修改用户名");

                // 设置修改按钮的点击事件
                btnModify.setOnClickListener(v -> {
                    // 获取输入的手机号、新用户名和确认用户名
                    String etPhone = this.etPhone.getText().toString();
                    String newInformation = etNew.getText().toString();
                    String rnewInformation = etRnew.getText().toString();

                    // 检查手机号是否为空
                    if (etPhone.isEmpty()) {
                        Toast.makeText(this, "手机号不能为空!", Toast.LENGTH_SHORT).show();
                        return;
                    }

                    // 检查输入的手机号是否与当前用户手机号一致
                    if (!etPhone.equals(phone)) {
                        Toast.makeText(this, "请检查手机号是否一致!", Toast.LENGTH_SHORT).show();
                        return;
                    }

                    // 检查新用户名和确认用户名是否一致
                    if (!newInformation.equals(rnewInformation)) {
                        Toast.makeText(this, "新用户名与确认用户名不一致!", Toast.LENGTH_SHORT).show();
                        return;
                    }

                    // 使用线程池异步执行用户名更新操作
                    executorService.execute(() -> {
                        boolean success = userDao.updateUserNameByPhone(phone, newInformation);

                        runOnUiThread(() -> {
                            if (success) {
                                // 显示修改成功消息并跳转到主界面
                                Toast.makeText(this, "修改成功!", Toast.LENGTH_SHORT).show();
                                Intent intent = new Intent(ModifyInformationActivity.this, MainActivity.class);
                                intent.putExtra("state", "mine");
                                startActivity(intent);
                                finish();
                            } else {
                                Toast.makeText(this, "修改失败,请联系管理员!", Toast.LENGTH_SHORT).show();
                            }
                        });
                    });
                });
            }
        }
    }

1. 修改密码:
   - 界面设置:
     - 如果传递的 `information` 为 `"password"`,则设置密码相关的提示文本和标题。
   - 点击事件处理:
     - 获取输入的手机号、新密码和确认密码。
     - 验证手机号是否为空且是否与当前用户手机号一致。
     - 验证新密码的长度是否在 6 到 16 位之间。
     - 验证新密码和确认密码是否一致。
   - 异步操作:
     - 使用线程池异步执行密码更新操作。
     - 更新成功后,清除 `SharedPreferences` 中的用户数据,显示成功消息,跳转到主界面并结束当前活动。
     - 更新失败时,显示错误消息。
2. 修改用户名:
   - 界面设置:
     - 如果传递的 `information` 为 `"userName"`,则设置用户名相关的提示文本和标题。
   - 点击事件处理:
     - 获取输入的手机号、新用户名和确认用户名。
     - 验证手机号是否为空且是否与当前用户手机号一致。
     - 验证新用户名和确认用户名是否一致。
   - 异步操作:
     - 使用线程池异步执行用户名更新操作。
     - 更新成功后,显示成功消息,跳转到主界面并结束当前活动。
     - 更新失败时,显示错误消息。
 

四、项目完整源码

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2072435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

polarctf靶场[WEB]cookie欺骗、upload、签到

[web]cookie欺骗 考点&#xff1a;cookie值 工具&#xff1a;Burp Suite抓包 根据题目提示&#xff0c;cookie欺骗&#xff0c;所以要在cookie值寻找关键 进入网页之后&#xff0c;说只有admin用户才能得到flag&#xff0c;而我们此时只属于普通访客 我们查看cookie值&…

如何使用ssm实现视频点播系统设计与实现+vue

TOC ssm142视频点播系统设计与实现vue 绪论 1.1 研究背景 信息化的世界&#xff0c;对于互联网就是一个无国界的传播过程。视频信息也像其他很多网络交流工具一样&#xff0c;时刻在给每一个人带来信息全球化的过程中自由发布个性化信息平台&#xff0c;这就是互联网给人们…

VTK随笔四:VTK基本数据结构

一、可视化数据的基本特点 离散性&#xff1a;为了让计算机能够获取、处理和分析数据&#xff0c;必须对无限、连续的空间体进行采样&#xff0c;生成有限的采样数据点&#xff0c;这些数据以离散点的形式存储&#xff0c;采样的过程是一个离散化的过程。数据具有规则或不规则…

东南大学和东北大学

其实我五点多就醒了&#xff0c;生物钟天生如此&#xff0c;没办法。 只是在人家家里&#xff0c;不方便过早地有动静&#xff0c;而我的脑子&#xff0c;也还在酒力影响之下&#xff0c;并没有完全清楚&#xff0c;所以又闭目养神了一会儿。 看了几次时间&#xff0c;终于6点了…

高仿115资源网dz论坛模板

源码介绍 高仿115资源网dz论坛模板&#xff0c;首先去DZ论坛下个PHP版本安装好&#xff0c;把我们提供的模版上传到[template]目录。 本套模板是dz论坛仿115资源网开发的模板&#xff0c;dz论坛是腾讯旗下的论坛系统&#xff0c;非常的好用。 源码下载 高仿115资源网dz论坛模…

C++ STL 关联容器

系列文章目录 CSTL迭代器iterator设计 https://blog.csdn.net/surfaceyan/article/details/126772555 C STL 序列式容器(一 vector list) https://blog.csdn.net/surfaceyan/article/details/126860166 C STL 序列式容器(二 deque slist) https://blog.csdn.net/surfaceyan/ar…

Vue中的methods方法与computed计算属性的区别

在创建的 Vue 应用程序实例中&#xff0c;可以通过 methods 选项定义方法。应用程序实例本身会代理 methods 选项中的所有方法&#xff0c;因此可以像访问 data 数据那样来调用方法。在模板中绑定表达式只能用于简单的运算。如果运算比较复杂&#xff0c;可以使用 Vue.js 提供的…

求解向量中连续子向量的最大和

开篇 本篇文章旨在求解向量中n个连续子向量的最大和。题目来源是《编程珠玑》第8章《算法设计技术》。 问题描述 输入:具有n个浮点数的向量x; 输出:输入向量的任何连续子向量中的最大和; 例如&#xff1a;输入向量为31,-41,59,26,-53,58,97,-93,-23,84; 那么输出就是从59到97五…

基于java+springboot+mysql校园预约自习室网站43642-计算机毕业设计项目选题推荐(免费领源码)

摘要 在社会快速发展的影响下&#xff0c;教育事业蓬勃发展&#xff0c;大大增加了学校的数量、多样性、教育质量等要求&#xff0c;使教育的管理和运营比过去更加困难。依照这一现实为基础&#xff0c;设计一个快捷而又方便的校园预约自习室网站是一项十分重要并且有价值的事情…

回归预测|基于北方苍鹰优化最小二乘支持向量机的数据预测Matlab程序NGO-LSSVM 多特征输入单输出 含基础程序

回归预测|基于北方苍鹰优化最小二乘支持向量机的数据预测Matlab程序NGO-LSSVM 多特征输入单输出 含基础程序 文章目录 前言回归预测|基于北方苍鹰优化最小二乘支持向量机的数据预测Matlab程序NGO-LSSVM 多特征输入单输出 含基础程序 一、NGO-LSSVM模型1. LSSVM&#xff08;最小…

联网可视化:引领智能出行新时代

图扑车联网可视化系统整合数据监测与分析&#xff0c;提升交通管理效率&#xff0c;优化车辆调度&#xff0c;提高道路安全&#xff0c;为用户提供智能化、便捷的出行体验。

使用Python实现方波信号傅里叶变换

目录 概述 1 方波信号 1.1 问题描述 1.2 傅里叶级数的数学实现 2 函数实现 2.1 方波信号实现 2.2 方波信号的傅里叶函数 3 测试函数 3.1 测试原理 3.2 改变K值的波形变化 概述 本文主要介绍使用使用Python实现方波信号傅里叶变换的方法&#xff0c;笔者首先介绍了方…

如何使用ssm实现基于java的奶茶店管理系统的设计与实现

TOC ssm140基于java的奶茶店管理系统的设计与实现jsp 第一章 绪 论 1.1背景及意义 系统管理也都将通过计算机进行整体智能化操作&#xff0c;对于奶茶店管理系统所牵扯的管理及数据保存都是非常多的&#xff0c;例如管理员&#xff1b;主页、个人中心、用户管理、奶茶分类管…

Kubectl基础命令使用

一.Kubectl 基础命令 格式&#xff1a; kubectl [command] [TYPE] [NAME] [FLAGS] kubectl 是 Kubernetes 的命令行工具&#xff0c;用于管理 Kubernetes 集群。以下是一些常用的 kubectl 命令及其选项&#xff1a; 常用命令 获取资源 列出所有资源类型&#xff08;Pods、De…

【C++】OJ习题 篇1

&#x1f680;个人主页&#xff1a;奋斗的小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 &#x1f4a5;1、string&#x1f4a5;1.1 字符串相加&#x1f4a5;1.2 验证回文字符串&#x1f4a5;1.3 反转…

【奇某信-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

(论文解读)Domain Adaptation via Prompt Learning

摘要 无监督域适应( UDA )旨在将从带有标签的源域数据中学习到的模型适应到未标注的目标域数据集。现有的UDA方法通过对齐源域和目标域特征空间来学习领域不变特征。这种对齐是通过约束实现的&#xff0c;例如统计差异最小化或对抗学习。 然而&#xff0c;这些约束会导致语义…

【自动驾驶】控制算法(四)坐标变换与横向误差微分方程

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

浙大版循环结构程序设计 7-6-1 贪心法-找零钱

7-6-1 贪心法-找零钱 #include <stdio.h>int main(){int n5,n2,n1,money,total;int flag 1; //判断是否符合条件然后跳出循环scanf("%d",&money);if(money>100){printf("Invalid.");}for(n5money/5;(flag1)&&(n5>0);n5--){for(n2…

2-75 基于matlab的多尺度小波核svm预测

基于matlab的多尺度小波核svm预测&#xff0c;数据归一化操作&#xff0c;尺度小波核函数作为核函数进行训练&#xff0c;训练后的模型进行预测。程序已调通&#xff0c;可直接运行。 2-75 多尺度小波核 SVM预测 - 小红书 (xiaohongshu.com)