个人学习记录app
包含了注册,登录,设置查看每周目标,添加查看每日总结,添加查看每日编程记录。
登录活动:
package com.example.learningrecordapp.activities;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.learningrecordapp.R;
import com.example.learningrecordapp.utils.DBConnection;
import com.example.learningrecordapp.utils.EncryptionUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class LoginActivity extends AppCompatActivity {
private EditText etUserId, etPassword;
private Button btnLogin, btnRegister;
private SharedPreferences sharedPreferences; // 添加 SharedPreferences 对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initViews();
setupLoginButton();
setupRegisterNavigation();
}
private void initViews() {
etUserId = findViewById(R.id.et_login_user_id);
etPassword = findViewById(R.id.et_login_password);
btnLogin = findViewById(R.id.btn_login);
btnRegister = findViewById(R.id.btn_go_to_register);
// 初始化 SharedPreferences
sharedPreferences = getSharedPreferences("user_info", MODE_PRIVATE);
}
private void setupLoginButton() {
btnLogin.setOnClickListener(v -> {
String userId = etUserId.getText().toString().trim();
String password = etPassword.getText().toString().trim();
if (TextUtils.isEmpty(userId) || TextUtils.isEmpty(password)) {
Toast.makeText(this, "请输入学号和密码", Toast.LENGTH_SHORT).show();
return;
}
new LoginTask().execute(userId, password);
});
}
private void setupRegisterNavigation() {
btnRegister.setOnClickListener(v -> {
startActivity(new Intent(LoginActivity.this, RegisterActivity.class));
});
}
private class LoginTask extends AsyncTask<String, Void, Boolean> {
private String error = "";
@Override
protected Boolean doInBackground(String... params) {
String userId = params[0];
String password = params[1];
String encryptedPassword = EncryptionUtils.encryptPassword(password);
try (Connection conn = DBConnection.getConnection()) {
String sql = "SELECT * FROM users WHERE user_id = ? AND password = ?";
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, userId);
stmt.setString(2, encryptedPassword);
return stmt.executeQuery().next();
}
} catch (SQLException e) {
e.printStackTrace();
error = "网络连接失败,请重试";
return false;
}
}
@Override
protected void onPostExecute(Boolean success) {
if (success) {
// 登录成功后保存用户 ID 到 SharedPreferences
saveUserIdToSharedPreferences(etUserId.getText().toString().trim());
Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
startActivity(new Intent(LoginActivity.this, MainActivity.class));
finish();
} else {
Toast.makeText(LoginActivity.this, "登录失败:" + (TextUtils.isEmpty(error) ? "学号或密码错误" : error), Toast.LENGTH_SHORT).show();
}
}
}
// 添加保存用户 ID 到 SharedPreferences 的方法
private void saveUserIdToSharedPreferences(String userId) {
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("user_id", userId); // 键名需与 WeeklyGoalActivity 中一致
editor.apply(); // 使用 apply() 或 commit() 保存
}
}
界面 :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
android:gravity="center_horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="用户登录"
android:textSize="24sp"
android:textColor="@android:color/black"
android:layout_marginBottom="24dp" />
<!-- 用户ID -->
<EditText
android:id="@+id/et_login_user_id"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="学号(用户ID)"
android:padding="12dp"
android:background="@drawable/border_edittext"
android:textColorHint="@color/darker_gray"
android:layout_marginBottom="16dp" />
<!-- 密码 -->
<EditText
android:id="@+id/et_login_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="密码"
android:inputType="textPassword"
android:padding="12dp"
android:background="@drawable/border_edittext"
android:textColorHint="@color/darker_gray"
android:layout_marginBottom="24dp" />
<!-- 登录按钮 -->
<Button
android:id="@+id/btn_login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="登录"
android:background="@color/colorPrimary"
android:textColor="@android:color/white"
android:padding="12dp"
android:layout_marginBottom="16dp" />
<!-- 注册导航 -->
<Button
android:id="@+id/btn_go_to_register"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="还没有账号?立即注册"
android:textColor="@color/colorPrimary"
android:background="@android:color/transparent"
android:textSize="14sp" />
</LinearLayout>
注册活动:
```plaintext
package com.example.learningrecordapp.activities;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.learningrecordapp.R;
import com.example.learningrecordapp.utils.DBConnection;
import com.example.learningrecordapp.utils.EncryptionUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class RegisterActivity extends AppCompatActivity {
private EditText etUserId, etUsername, etPassword, etPhoneNumber, etUserUnit, etUserClass;
private Button btnRegister;
private SharedPreferences sharedPreferences;
private static final String SHARED_PREF_NAME = "user_info";
private static final String KEY_USER_ID = "user_id";
private static final String KEY_USERNAME = "username";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
initViews();
loadSavedUsername();
setupRegisterButton();
}
private void initViews() {
etUserId = findViewById(R.id.et_user_id);
etUsername = findViewById(R.id.et_username);
etPassword = findViewById(R.id.et_password);
etPhoneNumber = findViewById(R.id.et_phone_number);
etUserUnit = findViewById(R.id.et_user_unit);
etUserClass = findViewById(R.id.et_user_class);
btnRegister = findViewById(R.id.btn_register);
sharedPreferences = getSharedPreferences(SHARED_PREF_NAME, MODE_PRIVATE);
}
private void loadSavedUsername() {
String savedUsername = sharedPreferences.getString(KEY_USERNAME, "");
String savedUserId = sharedPreferences.getString(KEY_USER_ID, "");
if (!savedUsername.isEmpty()) {
etUsername.setText(savedUsername);
etUsername.setEnabled(false);
etUserId.setText(savedUserId);
etUserId.setEnabled(false);
} else {
etUsername.setEnabled(true);
etUserId.setEnabled(true);
}
}
private void setupRegisterButton() {
btnRegister.setOnClickListener(v -> {
String userId = etUserId.getText().toString().trim();
String username = etUsername.getText().toString().trim();
String password = etPassword.getText().toString().trim();
String phoneNumber = etPhoneNumber.getText().toString().trim();
String userUnit = etUserUnit.getText().toString().trim();
String userClass = etUserClass.getText().toString().trim();
if (validateInputs(userId, username, password, phoneNumber, userUnit, userClass)) {
new RegisterTask().execute(userId, username, password, phoneNumber, userUnit, userClass);
}
});
}
private boolean validateInputs(String userId, String username, String password, String phoneNumber, String userUnit, String userClass) {
if (userId.isEmpty()) {
Toast.makeText(this, "请输入学号(用户ID)", Toast.LENGTH_SHORT).show();
return false;
}
if (username.isEmpty() && sharedPreferences.getString(KEY_USERNAME, "").isEmpty()) {
Toast.makeText(this, "请输入姓名", Toast.LENGTH_SHORT).show();
return false;
}
if (password.isEmpty() || password.length() < 6 || password.length() > 16) {
Toast.makeText(this, "密码需6 - 16位", Toast.LENGTH_SHORT).show();
return false;
}
if (phoneNumber.isEmpty() || phoneNumber.length() != 11) {
Toast.makeText(this, "请输入有效的手机号码", Toast.LENGTH_SHORT).show();
return false;
}
if (userUnit.isEmpty() || userClass.isEmpty()) {
Toast.makeText(this, "请输入用户单位和班级", Toast.LENGTH_SHORT).show();
return false;
}
return true;
}
private class RegisterTask extends AsyncTask<String, Void, Boolean> {
private String errorMessage = "";
@Override
protected Boolean doInBackground(String... params) {
String userId = params[0];
String username = params[1];
String password = params[2];
String phoneNumber = params[3];
String userUnit = params[4];
String userClass = params[5];
try (Connection conn = DBConnection.getConnection()) {
// 检查用户ID是否已存在
String checkSql = "SELECT user_id FROM users WHERE user_id = ?";
try (PreparedStatement checkStmt = conn.prepareStatement(checkSql)) {
checkStmt.setString(1, userId);
ResultSet rs = checkStmt.executeQuery();
if (rs.next()) {
errorMessage = "该学号已注册!";
return false;
}
}
// 插入新用户
String insertSql = "INSERT INTO users (user_id, username, phone_number, user_unit, user_class, password) VALUES (?, ?, ?, ?, ?, ?)";
try (PreparedStatement insertStmt = conn.prepareStatement(insertSql)) {
insertStmt.setString(1, userId);
insertStmt.setString(2, username);
insertStmt.setString(3, phoneNumber);
insertStmt.setString(4, userUnit);
insertStmt.setString(5, userClass);
insertStmt.setString(6, EncryptionUtils.encryptPassword(password));
insertStmt.executeUpdate();
return true;
}
} catch (SQLException e) {
e.printStackTrace();
errorMessage = "注册失败,请稍后重试:" + e.getMessage();
return false;
}
}
@Override
protected void onPostExecute(Boolean success) {
if (success) {
saveUserInfo(etUserId.getText().toString(), etUsername.getText().toString());
Toast.makeText(RegisterActivity.this, "注册成功!", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
startActivity(intent);
finish();
} else {
Toast.makeText(RegisterActivity.this, errorMessage, Toast.LENGTH_SHORT).show();
}
}
}
private void saveUserInfo(String userId, String username) {
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(KEY_USER_ID, userId);
editor.putString(KEY_USERNAME, username);
editor.apply();
etUsername.setEnabled(false);
etUserId.setEnabled(false);
}
}
界面:
```plaintext
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center_horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="用户注册"
android:textSize="24sp"
android:textColor="@android:color/black"
android:layout_marginBottom="24dp" />
<!-- 用户ID -->
<EditText
android:id="@+id/et_user_id"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="学号(用户ID)"
android:padding="12dp"
android:background="@drawable/border_edittext"
android:textColorHint="@color/darker_gray"
android:layout_marginBottom="16dp" />
<!-- 用户名 -->
<EditText
android:id="@+id/et_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="姓名"
android:padding="12dp"
android:background="@drawable/border_edittext"
android:textColorHint="@color/darker_gray"
android:layout_marginBottom="16dp" />
<!-- 密码 -->
<EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="密码(6 - 16位)"
android:inputType="textPassword"
android:padding="12dp"
android:background="@drawable/border_edittext"
android:textColorHint="@color/darker_gray"
android:layout_marginBottom="16dp" />
<!-- 手机号码 -->
<EditText
android:id="@+id/et_phone_number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="手机号码"
android:inputType="phone"
android:padding="12dp"
android:background="@drawable/border_edittext"
android:textColorHint="@color/darker_gray"
android:layout_marginBottom="16dp" />
<!-- 用户单位 -->
<EditText
android:id="@+id/et_user_unit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="用户单位(如学院)"
android:padding="12dp"
android:background="@drawable/border_edittext"
android:textColorHint="@color/darker_gray"
android:layout_marginBottom="16dp" />
<!-- 用户班级 -->
<EditText
android:id="@+id/et_user_class"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="用户班级(如2023级计算机1班)"
android:padding="12dp"
android:background="@drawable/border_edittext"
android:textColorHint="@color/darker_gray"
android:layout_marginBottom="24dp" />
<!-- 注册按钮 -->
<Button
android:id="@+id/btn_register"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="注册"
android:background="@color/colorPrimary"
android:textColor="@android:color/white"
android:padding="12dp"
android:layout_marginBottom="16dp" />
</LinearLayout>
</ScrollView>
主活动:
```plaintext
package com.example.learningrecordapp.activities;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import com.example.learningrecordapp.R;
public class MainActivity extends AppCompatActivity {
private Button btnSetWeeklyGoal, btnAddDailySummary, btnAddDailyProgramming, btnViewWeeklyGoal;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnSetWeeklyGoal = findViewById(R.id.btn_set_weekly_goal);
btnAddDailySummary = findViewById(R.id.btn_add_daily_summary);
btnAddDailyProgramming = findViewById(R.id.btn_add_daily_programming);
btnViewWeeklyGoal = findViewById(R.id.btn_view_weekly_goal);
btnSetWeeklyGoal.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, WeeklyGoalActivity.class);
startActivity(intent);
}
});
btnAddDailySummary.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, DailySummaryActivity.class);
startActivity(intent);
}
});
btnAddDailyProgramming.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, DailyProgrammingActivity.class);
startActivity(intent);
}
});
btnViewWeeklyGoal.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, ViewWeeklyGoalActivity.class);
startActivity(intent);
}
});
}
}
界面:
```plaintext
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:padding="16dp"
android:background="#f4f4f9"> <!-- 设置背景颜色 -->
<Button
android:id="@+id/btn_set_weekly_goal"
android:layout_width="200dp"
android:layout_height="50dp"
android:text="设置每周目标"
android:textSize="18sp"
android:textColor="#ffffff"
android:background="#007bff"
android:layout_marginBottom="20dp"
android:elevation="4dp"
android:gravity="center" />
<Button
android:id="@+id/btn_add_daily_summary"
android:layout_width="200dp"
android:layout_height="50dp"
android:text="每日总结"
android:textSize="18sp"
android:textColor="#ffffff"
android:background="#28a745"
android:layout_marginBottom="20dp"
android:elevation="4dp"
android:gravity="center" />
<Button
android:id="@+id/btn_add_daily_programming"
android:layout_width="200dp"
android:layout_height="50dp"
android:text="添加每日编程记录"
android:textSize="18sp"
android:textColor="#ffffff"
android:background="#ffc107"
android:layout_marginBottom="20dp"
android:elevation="4dp"
android:gravity="center" />
<Button
android:id="@+id/btn_view_weekly_goal"
android:layout_width="200dp"
android:layout_height="50dp"
android:text="查看每周学习目标"
android:textSize="18sp"
android:textColor="#ffffff"
android:background="#dc3545"
android:elevation="4dp"
android:gravity="center" />
</LinearLayout>
每周目标功能:
```plaintext
package com.example.learningrecordapp.activities;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.learningrecordapp.R;
import com.example.learningrecordapp.entities.DailyPlan;
import com.example.learningrecordapp.entities.WeeklyGoal;
import com.example.learningrecordapp.utils.DBConnection;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class WeeklyGoalActivity extends AppCompatActivity {
private DatePicker dpWeekStart;
private EditText etTotalGoal, etMonday, etTuesday, etWednesday, etThursday, etFriday;
private Button btnSaveGoal;
private SharedPreferences sharedPreferences;
private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_weekly_goal);
initViews();
setupDatePicker();
setupSaveButton();
}
private void initViews() {
dpWeekStart = findViewById(R.id.dp_week_start);
etTotalGoal = findViewById(R.id.et_total_goal);
etMonday = findViewById(R.id.et_monday_plan);
etTuesday = findViewById(R.id.et_tuesday_plan);
etWednesday = findViewById(R.id.et_wednesday_plan);
etThursday = findViewById(R.id.et_thursday_plan);
etFriday = findViewById(R.id.et_friday_plan);
btnSaveGoal = findViewById(R.id.btn_save_goal);
// 获取登录时保存的用户信息
sharedPreferences = getSharedPreferences("user_info", MODE_PRIVATE);
}
private void setupDatePicker() {
// 默认选择当前周的周一
Calendar calendar = Calendar.getInstance();
setToMonday(calendar);
dpWeekStart.init(
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH),
null
);
}
private void setupSaveButton() {
btnSaveGoal.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 检查用户是否已登录(从SharedPreferences获取用户ID)
String userId = sharedPreferences.getString("user_id", "");
if (userId.isEmpty()) {
Toast.makeText(WeeklyGoalActivity.this, "请先登录", Toast.LENGTH_SHORT).show();
return;
}
Date weekStartDate = getSelectedMonday();
// 将 Editable 对象转换为 String 类型再调用 trim 方法
String totalGoal = etTotalGoal.getText().toString().trim();
String[] dailyPlans = {
etMonday.getText().toString().trim(),
etTuesday.getText().toString().trim(),
etWednesday.getText().toString().trim(),
etThursday.getText().toString().trim(),
etFriday.getText().toString().trim()
};
// 验证输入:总目标或至少一天计划不为空
if (totalGoal.isEmpty() && allDailyPlansEmpty(dailyPlans)) {
Toast.makeText(WeeklyGoalActivity.this, "总目标或至少一天的计划不可为空", Toast.LENGTH_SHORT).show();
return;
}
new SaveWeeklyGoalTask().execute(userId, weekStartDate, totalGoal, dailyPlans);
}
});
}
// 检查所有日计划是否都为空
private boolean allDailyPlansEmpty(String[] dailyPlans) {
for (String plan : dailyPlans) {
if (!plan.isEmpty()) return false;
}
return true;
}
private Date getSelectedMonday() {
int year = dpWeekStart.getYear();
int month = dpWeekStart.getMonth();
int day = dpWeekStart.getDayOfMonth();
Calendar calendar = Calendar.getInstance();
calendar.set(year, month, day);
setToMonday(calendar); // 调整到当周周一
return calendar.getTime();
}
private void setToMonday(Calendar calendar) {
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
if (dayOfWeek != Calendar.MONDAY) {
calendar.add(Calendar.DAY_OF_WEEK, - (dayOfWeek - Calendar.MONDAY));
}
}
private class SaveWeeklyGoalTask extends AsyncTask<Object, Void, Boolean> {
private String errorMessage = "";
@Override
protected Boolean doInBackground(Object... params) {
String userId = (String) params[0];
Date weekStartDate = (Date) params[1];
String totalGoal = (String) params[2];
String[] dailyPlans = (String[]) params[3];
try (Connection conn = DBConnection.getConnection()) {
// 1. 保存周目标
WeeklyGoal weeklyGoal = new WeeklyGoal();
weeklyGoal.setUserId(userId);
weeklyGoal.setWeekStartDate(new java.sql.Date(weekStartDate.getTime()));
weeklyGoal.setTotalGoal(totalGoal);
String goalSql = "INSERT INTO weekly_goals (user_id, week_start_date, total_goal) VALUES (?, ?, ?)";
try (PreparedStatement goalStmt = conn.prepareStatement(goalSql, PreparedStatement.RETURN_GENERATED_KEYS)) {
goalStmt.setString(1, weeklyGoal.getUserId());
goalStmt.setDate(2, weeklyGoal.getWeekStartDate());
goalStmt.setString(3, weeklyGoal.getTotalGoal());
goalStmt.executeUpdate();
// 获取生成的goal_id
int goalId = 0;
try (ResultSet rs = goalStmt.getGeneratedKeys()) {
if (rs.next()) goalId = rs.getInt(1);
}
// 2. 保存日计划(周一到周五)
Calendar calendar = Calendar.getInstance();
calendar.setTime(weekStartDate);
for (int i = 0; i < 5; i++) {
String planContent = dailyPlans[i];
if (!planContent.isEmpty()) {
DailyPlan dailyPlan = new DailyPlan();
dailyPlan.setGoalId(goalId);
dailyPlan.setPlanDate(new java.sql.Date(calendar.getTime().getTime()));
dailyPlan.setPlanContent(planContent);
String planSql = "INSERT INTO daily_plans (goal_id, plan_date, plan_content) VALUES (?, ?, ?)";
try (PreparedStatement planStmt = conn.prepareStatement(planSql)) {
planStmt.setInt(1, dailyPlan.getGoalId());
planStmt.setDate(2, dailyPlan.getPlanDate());
planStmt.setString(3, dailyPlan.getPlanContent());
planStmt.executeUpdate();
}
}
calendar.add(Calendar.DAY_OF_YEAR, 1); // 下一天
}
return true;
}
} catch (SQLException e) {
e.printStackTrace();
// 捕获外键约束等数据库异常
if (e.getMessage().contains("foreign key constraint")) {
errorMessage = "保存失败:周目标不存在,外键约束错误";
} else {
errorMessage = "保存失败:" + e.getMessage();
}
return false;
}
}
@Override
protected void onPostExecute(Boolean success) {
if (success) {
Toast.makeText(WeeklyGoalActivity.this, "周目标保存成功", Toast.LENGTH_SHORT).show();
finish(); // 保存后返回上一界面
} else {
Toast.makeText(WeeklyGoalActivity.this, errorMessage, Toast.LENGTH_SHORT).show();
}
}
}
}
界面:
```plaintext
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center_horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设定每周学习目标"
android:textSize="24sp"
android:textColor="@android:color/black"
android:layout_marginBottom="24dp" />
<!-- 周开始日期选择(固定为周一) -->
<DatePicker
android:id="@+id/dp_week_start"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:datePickerMode="calendar"
android:layout_marginBottom="24dp" />
<!-- 本周总目标 -->
<EditText
android:id="@+id/et_total_goal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="本周总目标"
android:padding="12dp"
android:background="@drawable/border_edittext"
android:textColorHint="@color/darker_gray"
android:layout_marginBottom="16dp" />
<!-- 周一到周五计划 -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="工作日学习计划"
android:textSize="16sp"
android:textColor="@color/darker_gray"
android:layout_marginBottom="8dp" />
<EditText
android:id="@+id/et_monday_plan"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="周一计划"
android:padding="12dp"
android:background="@drawable/border_edittext"
android:textColorHint="@color/darker_gray"
android:layout_marginBottom="8dp" />
<EditText
android:id="@+id/et_tuesday_plan"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="周二计划"
android:padding="12dp"
android:background="@drawable/border_edittext"
android:textColorHint="@color/darker_gray"
android:layout_marginBottom="8dp" />
<EditText
android:id="@+id/et_wednesday_plan"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="周三计划"
android:padding="12dp"
android:background="@drawable/border_edittext"
android:textColorHint="@color/darker_gray"
android:layout_marginBottom="8dp" />
<EditText
android:id="@+id/et_thursday_plan"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="周四计划"
android:padding="12dp"
android:background="@drawable/border_edittext"
android:textColorHint="@color/darker_gray"
android:layout_marginBottom="8dp" />
<EditText
android:id="@+id/et_friday_plan"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="周五计划"
android:padding="12dp"
android:background="@drawable/border_edittext"
android:textColorHint="@color/darker_gray"
android:layout_marginBottom="24dp" />
<!-- 保存按钮 -->
<Button
android:id="@+id/btn_save_goal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="保存周目标"
android:background="@color/colorPrimary"
android:textColor="@android:color/white"
android:padding="12dp" />
</LinearLayout>
</ScrollView>
查看每周目标功能:
```plaintext
package com.example.learningrecordapp.activities;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.learningrecordapp.R;
import com.example.learningrecordapp.entities.DailyPlan;
import com.example.learningrecordapp.entities.WeeklyGoal;
import com.example.learningrecordapp.utils.DBConnection;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
public class ViewWeeklyGoalActivity extends AppCompatActivity {
private DatePicker dpWeekStart;
private Button btnViewGoal;
private TextView tvWeekStartDate, tvTotalGoal;
private ListView lvDailyPlans;
private SharedPreferences sharedPreferences;
private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_weekly_goal);
initViews();
sharedPreferences = getSharedPreferences("user_info", MODE_PRIVATE);
setupButtonClickListener();
}
private void initViews() {
dpWeekStart = findViewById(R.id.dp_week_start);
btnViewGoal = findViewById(R.id.btn_view_goal);
tvWeekStartDate = findViewById(R.id.tv_week_start_date);
tvTotalGoal = findViewById(R.id.tv_total_goal);
lvDailyPlans = findViewById(R.id.lv_daily_plans);
}
private void setupButtonClickListener() {
btnViewGoal.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int year = dpWeekStart.getYear();
int month = dpWeekStart.getMonth();
int day = dpWeekStart.getDayOfMonth();
Calendar calendar = Calendar.getInstance();
calendar.set(year, month, day);
Date selectedDate = calendar.getTime();
new FetchWeeklyGoalTask().execute(sharedPreferences.getString("user_id", ""), selectedDate);
}
});
}
private class FetchWeeklyGoalTask extends AsyncTask<Object, Void, WeeklyGoal> {
private String errorMessage = "";
private List<DailyPlan> dailyPlans = new ArrayList<>();
@Override
protected WeeklyGoal doInBackground(Object... params) {
String userId = (String) params[0];
Date selectedDate = (Date) params[1];
WeeklyGoal weeklyGoal = null;
try (Connection conn = DBConnection.getConnection()) {
// 查询指定周的周目标
String goalSql = "SELECT * FROM weekly_goals WHERE user_id = ? AND week_start_date = ?";
try (PreparedStatement goalStmt = conn.prepareStatement(goalSql)) {
goalStmt.setString(1, userId);
goalStmt.setDate(2, new java.sql.Date(selectedDate.getTime()));
ResultSet goalRs = goalStmt.executeQuery();
if (goalRs.next()) {
weeklyGoal = new WeeklyGoal();
weeklyGoal.setGoalId(goalRs.getInt("goal_id"));
weeklyGoal.setUserId(goalRs.getString("user_id"));
weeklyGoal.setWeekStartDate(goalRs.getDate("week_start_date"));
weeklyGoal.setTotalGoal(goalRs.getString("total_goal"));
// 查询该周目标下的每日计划
String planSql = "SELECT * FROM daily_plans WHERE goal_id = ?";
try (PreparedStatement planStmt = conn.prepareStatement(planSql)) {
planStmt.setInt(1, weeklyGoal.getGoalId());
ResultSet planRs = planStmt.executeQuery();
while (planRs.next()) {
DailyPlan dailyPlan = new DailyPlan();
dailyPlan.setPlanId(planRs.getInt("plan_id"));
dailyPlan.setGoalId(planRs.getInt("goal_id"));
dailyPlan.setPlanDate(planRs.getDate("plan_date"));
dailyPlan.setPlanContent(planRs.getString("plan_content"));
dailyPlans.add(dailyPlan);
}
}
}
}
} catch (SQLException e) {
e.printStackTrace();
errorMessage = "获取周目标失败:" + e.getMessage();
}
return weeklyGoal;
}
@Override
protected void onPostExecute(WeeklyGoal weeklyGoal) {
if (weeklyGoal != null) {
tvWeekStartDate.setText("周开始日期: " + dateFormat.format(weeklyGoal.getWeekStartDate()));
tvTotalGoal.setText("总目标: " + weeklyGoal.getTotalGoal());
List<String> planItems = new ArrayList<>();
for (DailyPlan dailyPlan : dailyPlans) {
planItems.add(dateFormat.format(dailyPlan.getPlanDate()) + ": " + dailyPlan.getPlanContent());
}
ArrayAdapter<String> adapter = new ArrayAdapter<>(ViewWeeklyGoalActivity.this,
android.R.layout.simple_list_item_1, planItems);
lvDailyPlans.setAdapter(adapter);
} else {
Toast.makeText(ViewWeeklyGoalActivity.this, errorMessage.isEmpty() ? "未找到该周的周目标" : errorMessage, Toast.LENGTH_SHORT).show();
}
}
}
}
界面:
```plaintext
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<DatePicker
android:id="@+id/dp_week_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" />
<Button
android:id="@+id/btn_view_goal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查看目标"
android:layout_gravity="center_horizontal"
android:layout_marginTop="16dp" />
<TextView
android:id="@+id/tv_week_start_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textStyle="bold"
android:layout_marginTop="16dp" />
<TextView
android:id="@+id/tv_total_goal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:layout_marginTop="8dp" />
<ListView
android:id="@+id/lv_daily_plans"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp" />
</LinearLayout>
每日总结功能:
```plaintext
package com.example.learningrecordapp.activities;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.CalendarView;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.learningrecordapp.R;
import com.example.learningrecordapp.entities.DailySummary;
import com.example.learningrecordapp.utils.DBConnection;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DailySummaryActivity extends AppCompatActivity {
private CalendarView calendarView;
private EditText etSummaryContent, etBlogUrl;
private Button btnAddSummary, btnViewSummary;
private String selectedDate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_daily_summary);
initViews();
setupCalendarListener();
setupButtonListeners();
}
private void initViews() {
calendarView = findViewById(R.id.calendarView);
etSummaryContent = findViewById(R.id.et_summary_content);
etBlogUrl = findViewById(R.id.et_blog_url);
btnAddSummary = findViewById(R.id.btn_add_summary);
btnViewSummary = findViewById(R.id.btn_view_summary);
}
private void setupCalendarListener() {
calendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
@Override
public void onSelectedDayChange(CalendarView view, int year, int month, int dayOfMonth) {
Calendar calendar = Calendar.getInstance();
calendar.set(year, month, dayOfMonth);
Date date = calendar.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
selectedDate = sdf.format(date);
}
});
}
private void setupButtonListeners() {
btnAddSummary.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (TextUtils.isEmpty(selectedDate)) {
Toast.makeText(DailySummaryActivity.this, "请先选择日期", Toast.LENGTH_SHORT).show();
return;
}
String summaryContent = etSummaryContent.getText().toString().trim();
String blogUrl = etBlogUrl.getText().toString().trim();
if (TextUtils.isEmpty(summaryContent)) {
Toast.makeText(DailySummaryActivity.this, "请输入总结内容", Toast.LENGTH_SHORT).show();
return;
}
new SaveDailySummaryTask().execute(selectedDate, summaryContent, blogUrl);
}
});
btnViewSummary.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (TextUtils.isEmpty(selectedDate)) {
Toast.makeText(DailySummaryActivity.this, "请先选择日期", Toast.LENGTH_SHORT).show();
return;
}
new FetchDailySummaryTask().execute(selectedDate);
}
});
}
private class SaveDailySummaryTask extends AsyncTask<String, Void, Boolean> {
private String errorMessage = "";
@Override
protected Boolean doInBackground(String... params) {
String createDateStr = params[0];
String summaryContent = params[1];
String blogUrl = params[2];
try (Connection conn = DBConnection.getConnection()) {
String sql = "INSERT INTO daily_summaries (create_date, summary_content, blog_url) VALUES (?, ?, ?)";
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse(createDateStr);
Timestamp timestamp = new Timestamp(date.getTime()); // 将 Date 转换为 Timestamp
stmt.setTimestamp(1, timestamp); // 使用 setTimestamp 方法
stmt.setString(2, summaryContent);
stmt.setString(3, blogUrl);
stmt.executeUpdate();
return true;
}
} catch (Exception e) {
e.printStackTrace();
errorMessage = "保存失败:" + e.getMessage();
return false;
}
}
@Override
protected void onPostExecute(Boolean success) {
if (success) {
Toast.makeText(DailySummaryActivity.this, "总结保存成功", Toast.LENGTH_SHORT).show();
etSummaryContent.setText("");
etBlogUrl.setText("");
} else {
Toast.makeText(DailySummaryActivity.this, errorMessage, Toast.LENGTH_SHORT).show();
}
}
}
private class FetchDailySummaryTask extends AsyncTask<String, Void, DailySummary> {
private String errorMessage = "";
@Override
protected DailySummary doInBackground(String... params) {
String createDateStr = params[0];
try (Connection conn = DBConnection.getConnection()) {
String sql = "SELECT * FROM daily_summaries WHERE create_date = ?";
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse(createDateStr);
Timestamp timestamp = new Timestamp(date.getTime()); // 将 Date 转换为 Timestamp
stmt.setTimestamp(1, timestamp); // 使用 setTimestamp 方法
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
DailySummary summary = new DailySummary();
summary.setSummaryId(rs.getInt("summary_id"));
summary.setCreateDate(rs.getTimestamp("create_date")); // 获取 Timestamp 类型
summary.setSummaryContent(rs.getString("summary_content"));
summary.setBlogUrl(rs.getString("blog_url"));
return summary;
}
}
} catch (Exception e) {
e.printStackTrace();
errorMessage = "获取总结失败:" + e.getMessage();
}
return null;
}
@Override
protected void onPostExecute(DailySummary summary) {
if (summary != null) {
etSummaryContent.setText(summary.getSummaryContent());
etBlogUrl.setText(summary.getBlogUrl());
if (!TextUtils.isEmpty(summary.getBlogUrl())) {
etBlogUrl.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(summary.getBlogUrl()));
startActivity(intent);
}
});
}
} else {
Toast.makeText(DailySummaryActivity.this, errorMessage.isEmpty() ? "未找到该日的总结" : errorMessage, Toast.LENGTH_SHORT).show();
etSummaryContent.setText("");
etBlogUrl.setText("");
}
}
}
}
界面:
```plaintext
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<CalendarView
android:id="@+id/calendarView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ListView
android:id="@+id/lv_daily_summaries"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp" />
</LinearLayout>
每日编程记录活动:
```plaintext
package com.example.learningrecordapp.activities;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CalendarView;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.learningrecordapp.R;
import com.example.learningrecordapp.entities.DailyProgrammingRecord;
import com.example.learningrecordapp.utils.DBConnection;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DailyProgrammingActivity extends AppCompatActivity {
private EditText etPlanTime, etRequirementAnalysis, etDesignDocument, etCodeSpecification, etSpecificDesign, etSpecificCoding, etTesting, etWorkload, etSummary;
private Button btnSave, btnView;
private CalendarView calendarView;
private SharedPreferences sharedPreferences;
private String selectedDate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_daily_programming);
etPlanTime = findViewById(R.id.et_plan_time);
etRequirementAnalysis = findViewById(R.id.et_requirement_analysis);
etDesignDocument = findViewById(R.id.et_design_document);
etCodeSpecification = findViewById(R.id.et_code_specification);
etSpecificDesign = findViewById(R.id.et_specific_design);
etSpecificCoding = findViewById(R.id.et_specific_coding);
etTesting = findViewById(R.id.et_testing);
etWorkload = findViewById(R.id.et_workload);
etSummary = findViewById(R.id.et_summary);
btnSave = findViewById(R.id.btn_save);
btnView = findViewById(R.id.btn_view);
calendarView = findViewById(R.id.calendarView);
sharedPreferences = getSharedPreferences("user_info", MODE_PRIVATE);
calendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
@Override
public void onSelectedDayChange(CalendarView view, int year, int month, int dayOfMonth) {
selectedDate = year + "-" + (month + 1) + "-" + dayOfMonth;
}
});
btnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String planTime = etPlanTime.getText().toString();
String requirementAnalysis = etRequirementAnalysis.getText().toString();
String designDocument = etDesignDocument.getText().toString();
String codeSpecification = etCodeSpecification.getText().toString();
String specificDesign = etSpecificDesign.getText().toString();
String specificCoding = etSpecificCoding.getText().toString();
String testing = etTesting.getText().toString();
String workload = etWorkload.getText().toString();
String summary = etSummary.getText().toString();
if (planTime.isEmpty() || requirementAnalysis.isEmpty() || designDocument.isEmpty() || codeSpecification.isEmpty() || specificDesign.isEmpty() || specificCoding.isEmpty() || testing.isEmpty() || workload.isEmpty() || summary.isEmpty()) {
Toast.makeText(DailyProgrammingActivity.this, "请填写所有信息", Toast.LENGTH_SHORT).show();
return;
}
if (selectedDate == null) {
Toast.makeText(DailyProgrammingActivity.this, "请选择日期", Toast.LENGTH_SHORT).show();
return;
}
String userId = sharedPreferences.getString("user_id", "");
try {
Date recordDate = new SimpleDateFormat("yyyy-MM-dd").parse(selectedDate);
DailyProgrammingRecord record = new DailyProgrammingRecord(0, userId, recordDate, planTime, requirementAnalysis, designDocument, codeSpecification, specificDesign, specificCoding, testing, workload, summary);
new SaveDailyProgrammingRecordTask().execute(record);
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(DailyProgrammingActivity.this, "日期格式错误", Toast.LENGTH_SHORT).show();
}
}
});
btnView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (selectedDate == null) {
Toast.makeText(DailyProgrammingActivity.this, "请选择日期", Toast.LENGTH_SHORT).show();
return;
}
String userId = sharedPreferences.getString("user_id", "");
new FetchDailyProgrammingRecordTask().execute(userId, selectedDate);
}
});
}
private class SaveDailyProgrammingRecordTask extends AsyncTask<DailyProgrammingRecord, Void, Boolean> {
@Override
protected Boolean doInBackground(DailyProgrammingRecord... records) {
DailyProgrammingRecord record = records[0];
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try (Connection conn = DBConnection.getConnection()) {
String sql = "INSERT INTO daily_programming_records (user_id, record_date, plan_time, requirement_analysis_time, design_document_time, code_specification_time, specific_design_time, specific_coding_time, testing_time, workload_calculation, post_summary) VALUES (?,?,?,?,?,?,?,?,?,?,?)";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, record.getUserId());
pstmt.setString(2, sdf.format(record.getRecordDate()));
pstmt.setString(3, record.getPlanTime());
pstmt.setString(4, record.getRequirementAnalysisTime());
pstmt.setString(5, record.getDesignDocumentTime());
pstmt.setString(6, record.getCodeSpecificationTime());
pstmt.setString(7, record.getSpecificDesignTime());
pstmt.setString(8, record.getSpecificCodingTime());
pstmt.setString(9, record.getTestingTime());
pstmt.setString(10, record.getWorkloadCalculation());
pstmt.setString(11, record.getPostSummary());
pstmt.executeUpdate();
return true;
}
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
@Override
protected void onPostExecute(Boolean result) {
if (result) {
Toast.makeText(DailyProgrammingActivity.this, "每日编程记录保存成功", Toast.LENGTH_SHORT).show();
clearFields();
} else {
Toast.makeText(DailyProgrammingActivity.this, "保存失败,请稍后重试", Toast.LENGTH_SHORT).show();
}
}
}
private class FetchDailyProgrammingRecordTask extends AsyncTask<String, Void, DailyProgrammingRecord> {
@Override
protected DailyProgrammingRecord doInBackground(String... params) {
String userId = params[0];
String recordDate = params[1];
try (Connection conn = DBConnection.getConnection()) {
String sql = "SELECT * FROM daily_programming_records WHERE user_id = ? AND record_date = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, userId);
pstmt.setString(2, recordDate);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
int id = rs.getInt("id");
Date date = new SimpleDateFormat("yyyy-MM-dd").parse(rs.getString("record_date"));
String planTime = rs.getString("plan_time");
String requirementAnalysis = rs.getString("requirement_analysis_time");
String designDocument = rs.getString("design_document_time");
String codeSpecification = rs.getString("code_specification_time");
String specificDesign = rs.getString("specific_design_time");
String specificCoding = rs.getString("specific_coding_time");
String testing = rs.getString("testing_time");
String workload = rs.getString("workload_calculation");
String summary = rs.getString("post_summary");
return new DailyProgrammingRecord(id, userId, date, planTime, requirementAnalysis, designDocument, codeSpecification, specificDesign, specificCoding, testing, workload, summary);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(DailyProgrammingRecord record) {
if (record != null) {
etPlanTime.setText(record.getPlanTime());
etRequirementAnalysis.setText(record.getRequirementAnalysisTime());
etDesignDocument.setText(record.getDesignDocumentTime());
etCodeSpecification.setText(record.getCodeSpecificationTime());
etSpecificDesign.setText(record.getSpecificDesignTime());
etSpecificCoding.setText(record.getSpecificCodingTime());
etTesting.setText(record.getTestingTime());
etWorkload.setText(record.getWorkloadCalculation());
etSummary.setText(record.getPostSummary());
} else {
Toast.makeText(DailyProgrammingActivity.this, "未找到该日期的记录", Toast.LENGTH_SHORT).show();
clearFields();
}
}
}
private void clearFields() {
etPlanTime.setText("");
etRequirementAnalysis.setText("");
etDesignDocument.setText("");
etCodeSpecification.setText("");
etSpecificDesign.setText("");
etSpecificCoding.setText("");
etTesting.setText("");
etWorkload.setText("");
etSummary.setText("");
}
}
界面:
```plaintext
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<CalendarView
android:id="@+id/calendarView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:fillViewport="true">
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:stretchColumns="*"
android:background="@android:color/white"
android:padding="8dp"
android:elevation="4dp">
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/darker_gray"
android:padding="8dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="项目"
android:textColor="@android:color/white"
android:textStyle="bold" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="时间/内容"
android:textColor="@android:color/white"
android:textStyle="bold" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:padding="4dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="计划时间"
android:paddingRight="8dp" />
<EditText
android:id="@+id/et_plan_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/edit_text_border"
android:padding="4dp" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:padding="4dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="需求分析时间"
android:paddingRight="8dp" />
<EditText
android:id="@+id/et_requirement_analysis"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/edit_text_border"
android:padding="4dp" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:padding="4dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设计文档时间"
android:paddingRight="8dp" />
<EditText
android:id="@+id/et_design_document"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/edit_text_border"
android:padding="4dp" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:padding="4dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="代码规范时间"
android:paddingRight="8dp" />
<EditText
android:id="@+id/et_code_specification"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/edit_text_border"
android:padding="4dp" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:padding="4dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="详细设计时间"
android:paddingRight="8dp" />
<EditText
android:id="@+id/et_specific_design"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/edit_text_border"
android:padding="4dp" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:padding="4dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="详细编码时间"
android:paddingRight="8dp" />
<EditText
android:id="@+id/et_specific_coding"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/edit_text_border"
android:padding="4dp" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:padding="4dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="测试时间"
android:paddingRight="8dp" />
<EditText
android:id="@+id/et_testing"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/edit_text_border"
android:padding="4dp" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:padding="4dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="工作量计算"
android:paddingRight="8dp" />
<EditText
android:id="@+id/et_workload"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/edit_text_border"
android:padding="4dp" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:padding="4dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="总结"
android:paddingRight="8dp" />
<EditText
android:id="@+id/et_summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/edit_text_border"
android:padding="4dp" />
</TableRow>
</TableLayout>
</ScrollView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center"
android:layout_marginTop="16dp">
<Button
android:id="@+id/btn_save"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="保存"
android:layout_marginRight="8dp" />
<Button
android:id="@+id/btn_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="查看记录"
android:layout_marginLeft="8dp" />
</LinearLayout>
</LinearLayout>
以上是主要功能的代码。
整体架构:


浙公网安备 33010602011771号