You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

238 lines
8.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package com.example.doitnow;
import android.app.AlertDialog;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.TextView;
import android.view.View;
import android.widget.NumberPicker;
import android.view.Gravity;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.gridlayout.widget.GridLayout;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import com.example.doitnow.Adapter.kebiaoManager;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
public class ScheduleFragment extends Fragment {
private View tv;
private FrameLayout popupOverlay;
private List<Lesson> kebiaodata = new ArrayList<>();
private static List<TextView> alltext = new ArrayList<>();
private kebiaoManager km;
private Date currentWeekDate;
public static Date firstSunday(Date startdate) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(startdate);
while (calendar.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) {
calendar.add(Calendar.DATE, -1);
}
return calendar.getTime();
}
public void changeweekclick(View view) {
Button clickedButton = (Button) view;
String buttonText = clickedButton.getText().toString();
int weeknum = Integer.parseInt(buttonText.replaceAll("\\D+", ""));
try {
currentWeekDate = km.getweekdate(weeknum);
displaylesson(currentWeekDate);
} catch (ParseException ignored) {
}
popupOverlay.setVisibility(View.GONE);
}
public void setdatetext(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
SimpleDateFormat sdf = new SimpleDateFormat("M-d");
for (int i = 115; i <= 121; i++) {
int resID = getResources().getIdentifier("textView" + i, "id", requireContext().getPackageName());
TextView textView = tv.findViewById(resID);
if (textView != null) {
textView.setText(sdf.format(calendar.getTime()));
calendar.add(Calendar.DATE, 1);
}
}
}
public void displaylesson(Date date) {
GridLayout gridLayout = tv.findViewById(R.id.timetable_container);
gridLayout.removeAllViews();
// 设置顶部周次按钮文本
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d");
String weekdate = sdf.format(date);
int weeknum = km.getweeknum(weekdate);
Button bt1 = tv.findViewById(R.id.button3);
bt1.setText("第" + weeknum + "周");
bt1.setVisibility(View.VISIBLE);
setdatetext(date);
// 读取课程
try {
kebiaodata = km.lessoninweek(date);
} catch (ParseException e) {
throw new RuntimeException(e);
}
// ✅ 创建 13×7 的空白课表格子
TextView[][] allCells = new TextView[13][7];
for (int row = 0; row < 13; row++) {
for (int col = 0; col < 7; col++) {
TextView cell = new TextView(requireContext());
GridLayout.LayoutParams params = new GridLayout.LayoutParams();
params.rowSpec = GridLayout.spec(row, 1, 1f);
params.columnSpec = GridLayout.spec(col, 1, 1);
params.width = 0;
params.height = 0;
params.setMargins(6, 6, 6, 6);
cell.setLayoutParams(params);
cell.setBackgroundColor(Color.WHITE); // 默认空白
cell.setGravity(Gravity.CENTER);
cell.setText("");
cell.setTextSize(12);
gridLayout.addView(cell);
allCells[row][col] = cell;
}
}
// ✅ 添加课程信息
for (Lesson lesson : kebiaodata) {
int row = lesson.fromClass - 1;
int rowSpan = lesson.endClass - lesson.fromClass + 1;
int col = lesson.day;
if (row >= 0 && row + rowSpan <= 13 && col >= 0 && col < 7) {
TextView cell = allCells[row][col];
String text = lesson.name;
if (!Objects.equals(lesson.classroom, "null")) {
text += "\n" + lesson.classroom;
}
cell.setText(text);
cell.setTextColor(Color.WHITE);
cell.setBackgroundColor(Color.parseColor("#B388FF"));
cell.setGravity(Gravity.CENTER);
GridLayout.LayoutParams params = (GridLayout.LayoutParams) cell.getLayoutParams();
params.rowSpec = GridLayout.spec(row, rowSpan, 1f);
cell.setLayoutParams(params);
// 隐藏合并下方单元格
for (int i = 1; i < rowSpan; i++) {
allCells[row + i][col].setVisibility(View.GONE);
}
}
}
// ✅ 更新日期范围显示
TextView dateSummary = tv.findViewById(R.id.date_summary);
SimpleDateFormat rangeFormat = new SimpleDateFormat("yyyy/M/d");
Calendar cal = Calendar.getInstance();
cal.setTime(date);
String start = rangeFormat.format(cal.getTime());
cal.add(Calendar.DATE, 6);
String end = rangeFormat.format(cal.getTime());
dateSummary.setText(start + " ~ " + end);
}
public void showWeekPickerDialog(Button weekButton) {
final NumberPicker picker = new NumberPicker(requireContext());
picker.setMinValue(1);
picker.setMaxValue(20);
picker.setValue(km.getweeknum(new SimpleDateFormat("yyyy-M-d").format(currentWeekDate)));
new AlertDialog.Builder(requireContext())
.setTitle("选择周次")
.setView(picker)
.setPositiveButton("确定", (dialog, which) -> {
int week = picker.getValue();
try {
currentWeekDate = km.getweekdate(week);
displaylesson(currentWeekDate);
} catch (ParseException ignored) {}
})
.setNegativeButton("取消", null)
.show();
}
public void weekclick(View view) {
Button weekButton = view.findViewById(R.id.button3);
showWeekPickerDialog(weekButton);
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
km = new kebiaoManager(requireContext());
return inflater.inflate(R.layout.fragment_schedule, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
tv = view;
Button button = view.findViewById(R.id.button3);
button.setOnClickListener(this::weekclick);
popupOverlay = view.findViewById(R.id.frameLayout2);
popupOverlay.setVisibility(View.GONE);
popupOverlay.setOnClickListener(v -> popupOverlay.setVisibility(View.GONE));
GridLayout gridLayout = view.findViewById(R.id.timetable_container);
gridLayout.removeAllViews();
alltext.clear();
for (int row = 0; row < 13; row++) {
for (int col = 0; col < 7; col++) {
TextView cell = new TextView(requireContext());
GridLayout.LayoutParams param = new GridLayout.LayoutParams();
param.width = 0;
param.height = 0;
param.rowSpec = GridLayout.spec(row, 1f);
param.columnSpec = GridLayout.spec(col, 1f);
param.setMargins(6, 6, 6, 6); // 上、左、下、右 各 6dp 间距
cell.setLayoutParams(param);
cell.setTextSize(12);
cell.setText("");
cell.setBackgroundColor(Color.WHITE);
cell.setGravity(Gravity.CENTER);
gridLayout.addView(cell);
alltext.add(cell);
}
}
for (int i = 9; i <= 24; i++) {
int resID = getResources().getIdentifier("button" + i, "id", requireContext().getPackageName());
Button bt = view.findViewById(resID);
if (bt != null) {
bt.setOnClickListener(this::changeweekclick);
}
}
currentWeekDate = firstSunday(new Date());
displaylesson(currentWeekDate);
}
}