From 5c66d9ef96fd7452759f4fede2366b4a5f4fe6e8 Mon Sep 17 00:00:00 2001 From: gq <15933486098@qq.com> Date: Thu, 29 May 2025 08:09:12 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E9=87=8A=E4=BA=86=E7=B1=BB=E5=A6=82?= =?UTF-8?q?=E4=BD=95=E5=B0=81=E8=A3=85PopupMenu=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../micode/notes/ui/AlarmInitReceiver.java | 51 ++++++++++++++----- .../net/micode/notes/ui/DropdownMenu.java | 34 +++++++++++++ 2 files changed, 72 insertions(+), 13 deletions(-) diff --git a/Notesmaster/app/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java b/Notesmaster/app/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java index f221202..abe0d88 100644 --- a/Notesmaster/app/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java +++ b/Notesmaster/app/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java @@ -28,37 +28,62 @@ import net.micode.notes.data.Notes; import net.micode.notes.data.Notes.NoteColumns; +/** + * 闹钟初始化广播接收器,用于设置未来提醒的笔记闹钟 + */ public class AlarmInitReceiver extends BroadcastReceiver { - + // 查询笔记时需要的列名数组 private static final String [] PROJECTION = new String [] { - NoteColumns.ID, - NoteColumns.ALERTED_DATE + NoteColumns.ID, // 笔记ID列 + NoteColumns.ALERTED_DATE // 提醒日期列 }; - private static final int COLUMN_ID = 0; - private static final int COLUMN_ALERTED_DATE = 1; + // 列索引常量 + private static final int COLUMN_ID = 0; // ID列的索引 + private static final int COLUMN_ALERTED_DATE = 1; // 提醒日期列的索引 + /** + * 接收广播时触发的方法 + * @param context 上下文对象 + * @param intent 接收到的意图 + */ @Override public void onReceive(Context context, Intent intent) { + // 获取当前系统时间 long currentDate = System.currentTimeMillis(); - Cursor c = context.getContentResolver().query(Notes.CONTENT_NOTE_URI, - PROJECTION, - NoteColumns.ALERTED_DATE + ">? AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE, - new String[] { String.valueOf(currentDate) }, - null); + + // 查询内容提供器获取需要设置提醒的笔记 + Cursor c = context.getContentResolver().query( + Notes.CONTENT_NOTE_URI, // 笔记内容URI + PROJECTION, // 要查询的列 + NoteColumns.ALERTED_DATE + ">? AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE, // 查询条件:提醒日期大于当前时间且类型为普通笔记 + new String[] { String.valueOf(currentDate) }, // 查询参数 + null); // 排序方式 if (c != null) { + // 如果有查询结果 if (c.moveToFirst()) { do { + // 获取提醒日期 long alertDate = c.getLong(COLUMN_ALERTED_DATE); + + // 创建闹钟接收器Intent Intent sender = new Intent(context, AlarmReceiver.class); + // 设置Intent的数据URI(包含笔记ID) sender.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, c.getLong(COLUMN_ID))); + + // 创建PendingIntent PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, sender, 0); - AlarmManager alermManager = (AlarmManager) context + + // 获取AlarmManager服务 + AlarmManager alarmManager = (AlarmManager) context .getSystemService(Context.ALARM_SERVICE); - alermManager.set(AlarmManager.RTC_WAKEUP, alertDate, pendingIntent); - } while (c.moveToNext()); + + // 设置闹钟,在指定时间触发 + alarmManager.set(AlarmManager.RTC_WAKEUP, alertDate, pendingIntent); + } while (c.moveToNext()); // 处理下一条记录 } + // 关闭Cursor c.close(); } } diff --git a/Notesmaster/app/src/main/java/net/micode/notes/ui/DropdownMenu.java b/Notesmaster/app/src/main/java/net/micode/notes/ui/DropdownMenu.java index 613dc74..c3309cf 100644 --- a/Notesmaster/app/src/main/java/net/micode/notes/ui/DropdownMenu.java +++ b/Notesmaster/app/src/main/java/net/micode/notes/ui/DropdownMenu.java @@ -27,17 +27,38 @@ import android.widget.PopupMenu.OnMenuItemClickListener; import net.micode.notes.R; +/** + * 下拉菜单控件封装类 + * 封装了PopupMenu的使用,提供更简便的下拉菜单实现方式 + */ public class DropdownMenu { + // 触发下拉菜单的按钮控件 private Button mButton; + // PopupMenu对象,实现下拉菜单功能 private PopupMenu mPopupMenu; + // 菜单对象,包含所有菜单项 private Menu mMenu; + /** + * 构造函数 + * @param context 上下文对象 + * @param button 触发下拉菜单的按钮 + * @param menuId 菜单资源ID + */ public DropdownMenu(Context context, Button button, int menuId) { + // 初始化按钮引用 mButton = button; + // 设置按钮背景图标 mButton.setBackgroundResource(R.drawable.dropdown_icon); + + // 创建PopupMenu实例,绑定到按钮 mPopupMenu = new PopupMenu(context, mButton); + // 获取菜单对象 mMenu = mPopupMenu.getMenu(); + // 从资源文件填充菜单 mPopupMenu.getMenuInflater().inflate(menuId, mMenu); + + // 设置按钮点击事件,点击时显示下拉菜单 mButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { mPopupMenu.show(); @@ -45,16 +66,29 @@ public class DropdownMenu { }); } + /** + * 设置菜单项点击监听器 + * @param listener 菜单项点击监听器 + */ public void setOnDropdownMenuItemClickListener(OnMenuItemClickListener listener) { if (mPopupMenu != null) { mPopupMenu.setOnMenuItemClickListener(listener); } } + /** + * 查找指定ID的菜单项 + * @param id 菜单项ID + * @return 找到的菜单项,未找到返回null + */ public MenuItem findItem(int id) { return mMenu.findItem(id); } + /** + * 设置按钮显示的标题文本 + * @param title 要显示的标题文本 + */ public void setTitle(CharSequence title) { mButton.setText(title); }