Android 日历打卡:在日历上添加爱心图标
要在日历上将打卡成功的日期加上一个爱心,可以通过自定义日历的单元格来实现。首先,在布局文件中,为每个单元格添加一个 ImageView 来显示爱心图标。修改布局文件 'oclock.xml' 如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<CalendarView
android:id="@+id/calendarView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/checkInButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打卡" />
<TextView
android:id="@+id/countdownTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="倒计时" />
<GridView
android:id="@+id/calendarGridView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:numColumns="7" />
</LinearLayout>
接下来,在 'ClockActivity' 中,修改 'onCreate' 方法,添加一个自定义的 'CalendarAdapter' 来显示日历,并在打卡成功后更新日历的显示。修改后的代码如下:
public class ClockActivity extends AppCompatActivity {
private TextView countdownTextView;
private CalendarView calendarView;
private Button checkInButton;
private AppDatabase appDatabase;
private GridView calendarGridView;
private CalendarAdapter calendarAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.oclock);
InitviewS();
countdownTextView = findViewById(R.id.countdownTextView);
calendarView = findViewById(R.id.calendarView);
checkInButton = findViewById(R.id.checkInButton);
appDatabase = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "check-in-db")
.allowMainThreadQueries()
.build();
calendarGridView = findViewById(R.id.calendarGridView);
calendarAdapter = new CalendarAdapter(this);
calendarGridView.setAdapter(calendarAdapter);
calendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
@Override
public void onSelectedDayChange(CalendarView view, int year, int month, int dayOfMonth) {
String selectedDate = formatDate(year, month, dayOfMonth);
Toast.makeText(com.example.pg_helper.ClockActivity.this, "选择的日期:" + selectedDate, Toast.LENGTH_SHORT).show();
}
});
checkInButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String currentDate = getCurrentDate();
String currentTime = getCurrentTime();
CheckIn checkIn = new CheckIn(currentDate, currentTime);
appDatabase.checkInDao().insert(checkIn);
Toast.makeText(com.example.pg_helper.ClockActivity.this, "打卡成功:" + currentDate + " " + currentTime, Toast.LENGTH_SHORT).show();
int checkInCount = appDatabase.checkInDao().getCheckInCount();
// Toast.makeText(com.example.pg_helper.ClockActivity.this, "已打卡次数:" + checkInCount, Toast.LENGTH_SHORT).show();
// 更新日历显示
calendarAdapter.updateCheckInDates(appDatabase.checkInDao().getAllCheckIns());
}
});
int checkInCount = appDatabase.checkInDao().getCheckInCount();
Toast.makeText(com.example.pg_helper.ClockActivity.this, "已打卡次数:" + checkInCount, Toast.LENGTH_SHORT).show();
List<CheckIn> checkIns = appDatabase.checkInDao().getAllCheckIns();
for (CheckIn checkIn : checkIns) {
System.out.println("打卡记录:" + checkIn.getDate() + " " + checkIn.getTime());
}
// 获取当前时间
Calendar calendar = Calendar.getInstance();
Date currentDate = calendar.getTime();
// 设置目标日期为今年的12月24日
calendar.set(Calendar.MONTH, Calendar.DECEMBER);
calendar.set(Calendar.DAY_OF_MONTH, 24);
Date targetDate = calendar.getTime();
// 计算时间差
long timeDiff = targetDate.getTime() - currentDate.getTime();
// 创建倒计时器
new CountDownTimer(timeDiff, 1000) {
@Override
public void onTick(long millisUntilFinished) {
// 将时间差转换为月、日、时、分、秒
long days = TimeUnit.MILLISECONDS.toDays(millisUntilFinished);
millisUntilFinished -= TimeUnit.DAYS.toMillis(days);
long hours = TimeUnit.MILLISECONDS.toHours(millisUntilFinished);
millisUntilFinished -= TimeUnit.HOURS.toMillis(hours);
long minutes = TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished);
millisUntilFinished -= TimeUnit.MINUTES.toMillis(minutes);
long seconds = TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished);
// 更新倒计时文本
String countdownText = String.format(Locale.getDefault(),
"%02d月:%02d日:%02d时:%02d分:%02d秒",
days / 30, days % 30, hours, minutes, seconds);
countdownTextView.setText(countdownText);
}
@Override
public void onFinish() {
countdownTextView.setText("考研时间到!");
}
}.start();
}
// 省略其他方法...
private class CalendarAdapter extends BaseAdapter {
private Context context;
private List<CheckIn> checkInDates;
public CalendarAdapter(Context context) {
this.context = context;
this.checkInDates = appDatabase.checkInDao().getAllCheckIns();
}
public void updateCheckInDates(List<CheckIn> checkInDates) {
this.checkInDates = checkInDates;
notifyDataSetChanged();
}
@Override
public int getCount() {
return 42; // 6行7列的日历
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.calendar_cell, parent, false);
}
TextView dateTextView = convertView.findViewById(R.id.dateTextView);
ImageView checkInImageView = convertView.findViewById(R.id.checkInImageView);
// 设置日期文本
int dayOfMonth = getDayOfMonth(position);
dateTextView.setText(String.valueOf(dayOfMonth));
// 判断该日期是否打卡成功
String currentDate = getCurrentDate();
for (CheckIn checkIn : checkInDates) {
if (checkIn.getDate().equals(currentDate) && checkIn.getDayOfMonth() == dayOfMonth) {
checkInImageView.setVisibility(View.VISIBLE);
break;
} else {
checkInImageView.setVisibility(View.GONE);
}
}
return convertView;
}
private int getDayOfMonth(int position) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.add(Calendar.DAY_OF_MONTH, position - calendar.get(Calendar.DAY_OF_WEEK) + 1);
return calendar.get(Calendar.DAY_OF_MONTH);
}
}
}
最后,创建一个新的布局文件 'calendar_cell.xml',用于显示日历单元格的样式。在该布局文件中,添加一个 ImageView 来显示爱心图标。代码如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/dateTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textSize="16sp" />
<ImageView
android:id="@+id/checkInImageView"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:layout_marginEnd="4dp"
android:layout_marginTop="4dp"
android:src="@drawable/ic_heart"
android:visibility="gone" />
</RelativeLayout>
这样,当打卡成功后,对应的日期单元格上就会显示一个爱心图标。
原文地址: https://www.cveoy.top/t/topic/b57I 著作权归作者所有。请勿转载和采集!