4.5

打卡功能实现
• 所花时间:5
• 代码行数:146
• 博客容量:1
• 代码如下:

package com.example.undertaking;

import androidx.appcompat.app.AppCompatActivity;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.example.undertaking.TaskPackage.DayDAO;
import com.example.undertaking.TaskPackage.DayTask;
import com.example.undertaking.TaskPackage.WeekDAO;
import com.example.undertaking.util.DateUtil;
import com.example.undertaking.util.ToastUtil;

import java.util.Timer;
import java.util.TimerTask;

public class setTaskOfDay extends AppCompatActivity implements View.OnClickListener {
    private TextView tv_name;
    private EditText goal;
    private SharedPreferences preferences;
    private Button startButton;
    private Button endButton;
    private Button submit;
    private Timer studyTimer; // 学习时间定时器
    private int studyMinutes; // 学习分钟数
    private DayTask dayTask;
    private TextView studyTime;

    // Handler 更新 UI
    private final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1:
                    updateStudyTimeUI();
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_set_task_of_day);

        tv_name = findViewById(R.id.tv_name);
        tv_name.setText("HELLO!  " + MyApplication.user.name);

        preferences = getSharedPreferences("task_status", MODE_PRIVATE);

        goal = findViewById(R.id.et_goal);
        submit = findViewById(R.id.bt_submit);
        startButton = findViewById(R.id.bt_start);
        endButton = findViewById(R.id.bt_end);
        studyTime = findViewById(R.id.study_time);

        startButton.setOnClickListener(this);
        endButton.setOnClickListener(this);
        submit.setOnClickListener(this);

        dayTask = new DayTask();
        dayTask.stuID = MyApplication.user.id;
        dayTask.today_ = DateUtil.getDate();
        dayTask.dayOfWeek = DateUtil.getDayOfWeek();
        reload();
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.bt_start) {
            startButton.setEnabled(false); // 禁用开始打卡按钮
            saveButtonStatus("start");
            Toast.makeText(this, "已开始打卡", Toast.LENGTH_SHORT).show();
            dayTask.startTime = DateUtil.getTime();

            // 启动定时器
            startStudyTimer();
        } else if (v.getId() == R.id.bt_end) {
            endButton.setEnabled(false); // 禁用结束打卡按钮
            saveButtonStatus("end");
            Toast.makeText(this, "已结束打卡", Toast.LENGTH_SHORT).show();
            dayTask.endTime = DateUtil.getTime();
            dayTask.studyMinutes = studyMinutes;
            submit.setEnabled(true);

            stopStudyTimer();
        } else if (v.getId() == R.id.bt_submit) {
            dayTask.studyInfo = goal.getText().toString();
            WeekDAO.WeekDaoRowListener weekDaoRowListener = new WeekDAO.WeekDaoRowListener() {
                @Override
                public void OperationCompletely(int result) {
                    WeekDAO.WeekFinishRateUpdate weekFinishRateUpdate=new WeekDAO.WeekFinishRateUpdate() {
                        @Override
                        public void OperationCompletely(Boolean result) {
                            if (!result){
                                ToastUtil.show(setTaskOfDay.this,"完成率更新失败");
                            }
                        }
                    };
                    WeekDAO.finishRateUpdate(String.valueOf(result), weekFinishRateUpdate);
                    dayTask.weekID = String.valueOf(result);
                    DayDAO.DayDaoInsertListener dayDaoInsertListener = new DayDAO.DayDaoInsertListener() {
                        @Override
                        public void OperationCompletely(boolean result) {
                            if (result) {
                                ToastUtil.show(setTaskOfDay.this, "提交成功");
                                submit.setEnabled(false);
                            } else {
                                ToastUtil.show(setTaskOfDay.this, "提交失败");
                            }
                        }
                    };
                    DayDAO.insert(dayTask, dayDaoInsertListener);
                }
            };
            WeekDAO.getRowCount(MyApplication.user.id, weekDaoRowListener);
        }
    }

    private void saveButtonStatus(String buttonType) {
        // 获取今天的日期
        String today = DateUtil.getDate();

        // 保存按下状态到 SharedPreferences
        SharedPreferences.Editor editor = preferences.edit();
        if (buttonType.equals("start")) {
            editor.putBoolean(today + "_start", true);
        } else if (buttonType.equals("end")) {
            editor.putBoolean(today + "_end", true);
        }
        editor.apply();
    }

    private void reload() {
        // 获取今天的日期
        String today = DateUtil.getDate();

        // 检查开始和结束打卡按钮的状态并相应地禁用按钮
        boolean isStartPressed = preferences.getBoolean(today + "_start", false);
        boolean isEndPressed = preferences.getBoolean(today + "_end", false);

        submit.setEnabled(false);
        if (isStartPressed) {
            startButton.setEnabled(false);
            startStudyTimer(); // 如果开始打卡按钮已经按下,启动定时器
        }
        if (isEndPressed && isStartPressed) {
            endButton.setEnabled(false);
        }
        if (isStartPressed && isEndPressed) {
            tv_name.setText("今日学习打卡已完成!!");
        }
    }

    private void startStudyTimer() {
        studyTimer = new Timer();
        studyMinutes = 0; // 初始化学习分钟数为0

        // 定义一个定时任务,每分钟更新一次学习分钟数
        studyTimer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                studyMinutes++; // 每次运行任务,学习分钟数加1
                // 发送消息给 Handler,通知更新 UI
                mHandler.sendEmptyMessage(1);
            }
        }, 60000, 60000); // 每隔一分钟执行一次任务
    }

    private void stopStudyTimer() {
        if (studyTimer != null) {
            studyTimer.cancel(); // 取消定时器
            studyTimer = null;
        }
    }

    private void updateStudyTimeUI() {
        // 更新学习时间显示
        studyTime.setText("学习时间:" + studyMinutes + "分钟");
    }
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
    android:background="@color/mainBackground">
    <TextView
        android:id="@+id/tv_name"
        android:layout_marginTop="10dp"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="hello!!"
        android:textSize="30sp"
        android:textColor="@color/white"/>

    <LinearLayout
        android:layout_marginTop="50dp"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:orientation="horizontal">
        <Button
            android:background="@drawable/my_button"
            android:id="@+id/bt_start"
            android:layout_width="140dp"
            android:layout_height="70dp"
            android:text="学习开始打卡"
            android:textColor="@color/white"
            android:textSize="17sp"
            />

        <Button
            android:layout_marginLeft="130dp"
            android:textSize="17sp"
            android:background="@drawable/my_button"
            android:id="@+id/bt_end"
            android:layout_width="140dp"
            android:layout_height="70dp"
            android:text="学习结束打卡"
            android:textColor="@color/white"
            />
    </LinearLayout>
    <TextView
        android:id="@+id/tips"
        android:layout_marginTop="50dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="输入今日的学习内容!"
        android:textSize="20sp"
        android:textColor="@color/white"
        android:gravity="center"
        />

    <EditText
        android:id="@+id/et_goal"
        android:hint="空"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:background="@drawable/my_edit"
        android:maxLength="150"
        android:textColor="@color/white"
        />
    <Button
        android:id="@+id/bt_submit"
        android:layout_marginTop="50dp"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/my_button"
        android:text="提交"
        android:textColor="@color/white"
        android:textSize="20sp"
        />

    <TextView
        android:layout_marginTop="30dp"
        android:id="@+id/study_time"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="25sp"
        android:gravity="center"
        android:text="学习时间:0"
        android:textColor="@color/white"
        />

</LinearLayout>
posted @ 2024-04-05 16:17  aallofitisst  阅读(4)  评论(0)    收藏  举报