要在日历上将打卡成功的日期加上一个爱心,可以通过自定义日历的单元格来实现。首先,在布局文件中,为每个单元格添加一个 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>

这样,当打卡成功后,对应的日期单元格上就会显示一个爱心图标。

Android 日历打卡:在日历上添加爱心图标

原文地址: https://www.cveoy.top/t/topic/b57I 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录