Compare commits

...

1 Commits

@ -0,0 +1,2 @@
#Fri May 31 08:13:10 CST 2024
gradle.version=7.4

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

@ -0,0 +1,117 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AndroidLayouts">
<shared>
<config />
</shared>
</component>
<component name="AutoImportSettings">
<option name="autoReloadType" value="NONE" />
</component>
<component name="ChangeListManager">
<list default="true" id="f6863d1a-b3ff-4e7b-bc36-3fd71ba8eea9" name="变更" comment="" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="ExecutionTargetManager" SELECTED_TARGET="device_and_snapshot_combo_box_target[C:\Users\Yourdestinystarts\.android\avd\Pixel_XL_API_30.avd]" />
<component name="ExternalProjectsData">
<projectState path="$PROJECT_DIR$">
<ProjectState />
</projectState>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/../.." />
</component>
<component name="MarkdownSettingsMigration">
<option name="stateVersion" value="1" />
</component>
<component name="ProjectId" id="2hD2X3RwpzKZMCFt3yNIDeW6JqH" />
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">
<property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
<property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
<property name="RunOnceActivity.cidr.known.project.marker" value="true" />
<property name="cidr.known.project.marker" value="true" />
<property name="last_opened_file_path" value="$PROJECT_DIR$" />
<property name="memory.settings.postsync.last.time.stamp" value="1717114402595" />
<property name="settings.editor.selected.configurable" value="vcs.Git" />
</component>
<component name="RunManager">
<configuration name="app" type="AndroidRunConfigurationType" factoryName="Android App">
<module name="miNotes.app.main" />
<option name="DEPLOY" value="true" />
<option name="DEPLOY_APK_FROM_BUNDLE" value="false" />
<option name="DEPLOY_AS_INSTANT" value="false" />
<option name="ARTIFACT_NAME" value="" />
<option name="PM_INSTALL_OPTIONS" value="" />
<option name="ALL_USERS" value="false" />
<option name="ALWAYS_INSTALL_WITH_PM" value="false" />
<option name="CLEAR_APP_STORAGE" value="false" />
<option name="DYNAMIC_FEATURES_DISABLED_LIST" value="" />
<option name="ACTIVITY_EXTRA_FLAGS" value="" />
<option name="MODE" value="default_activity" />
<option name="CLEAR_LOGCAT" value="false" />
<option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
<option name="INSPECTION_WITHOUT_ACTIVITY_RESTART" value="false" />
<option name="TARGET_SELECTION_MODE" value="DEVICE_AND_SNAPSHOT_COMBO_BOX" />
<option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
<option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
<option name="DEBUGGER_TYPE" value="Auto" />
<Auto>
<option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
<option name="SHOW_STATIC_VARS" value="true" />
<option name="WORKING_DIR" value="" />
<option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
<option name="SHOW_OPTIMIZED_WARNING" value="true" />
</Auto>
<Hybrid>
<option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
<option name="SHOW_STATIC_VARS" value="true" />
<option name="WORKING_DIR" value="" />
<option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
<option name="SHOW_OPTIMIZED_WARNING" value="true" />
</Hybrid>
<Java />
<Native>
<option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
<option name="SHOW_STATIC_VARS" value="true" />
<option name="WORKING_DIR" value="" />
<option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
<option name="SHOW_OPTIMIZED_WARNING" value="true" />
</Native>
<Profilers>
<option name="ADVANCED_PROFILING_ENABLED" value="false" />
<option name="STARTUP_PROFILING_ENABLED" value="false" />
<option name="STARTUP_CPU_PROFILING_ENABLED" value="false" />
<option name="STARTUP_CPU_PROFILING_CONFIGURATION_NAME" value="Java/Kotlin Method Sample (legacy)" />
<option name="STARTUP_NATIVE_MEMORY_PROFILING_ENABLED" value="false" />
<option name="NATIVE_MEMORY_SAMPLE_RATE_BYTES" value="2048" />
<option name="PROFILING_MODE" value="NOT_SET" />
</Profilers>
<option name="DEEP_LINK" value="" />
<option name="ACTIVITY_CLASS" value="" />
<option name="SEARCH_ACTIVITY_IN_GLOBAL_SCOPE" value="false" />
<option name="SKIP_ACTIVITY_VALIDATION" value="false" />
<method v="2">
<option name="Android.Gradle.BeforeRunTask" enabled="true" />
</method>
</configuration>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="应用程序级" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="默认任务">
<changelist id="f6863d1a-b3ff-4e7b-bc36-3fd71ba8eea9" name="变更" comment="" />
<created>1717114363858</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1717114363858</updated>
</task>
<servers />
</component>
</project>

@ -14,6 +14,13 @@
* limitations under the License.
*/
/*
* @author
* @time 2024520
* got it
* take a look便便
*/
package net.micode.notes.ui;
import android.app.Activity;
@ -40,20 +47,25 @@ import net.micode.notes.tool.DataUtils;
import java.io.IOException;
// 定义AlarmAlertActivity类继承自Activity类并实现OnClickListener和OnDismissListener接口
public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener {
private long mNoteId;
private String mSnippet;
private static final int SNIPPET_PREW_MAX_LEN = 60;
MediaPlayer mPlayer;
// 定义成员变量
private long mNoteId; // 笔记的唯一标识符
private String mSnippet; // 笔记的摘要
private static final int SNIPPET_PREW_MAX_LEN = 60; // 摘要预览的最大长度
private MediaPlayer mPlayer; // 用于播放声音的MediaPlayer对象
// onCreate方法Activity创建时调用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
requestWindowFeature(Window.FEATURE_NO_TITLE); // 请求无标题栏
// 获取窗口对象,并设置窗口属性
final Window win = getWindow();
win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
// 判断屏幕是否开启,如果未开启,则添加屏幕保持开启的窗口属性
if (!isScreenOn()) {
win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
@ -61,8 +73,8 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD
| WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR);
}
// 获取启动Activity的Intent并从中获取笔记ID和摘要
Intent intent = getIntent();
try {
mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1));
mSnippet = DataUtils.getSnippetById(this.getContentResolver(), mNoteId);
@ -74,23 +86,28 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD
return;
}
// 初始化MediaPlayer对象并播放闹钟声音
mPlayer = new MediaPlayer();
if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) {
showActionDialog();
playAlarmSound();
showActionDialog(); // 显示操作对话框
playAlarmSound(); // 播放闹钟声音
} else {
finish();
finish(); // 如果笔记不可见则结束Activity
}
}
// 判断屏幕是否开启的方法
private boolean isScreenOn() {
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
return pm.isScreenOn();
}
// 播放闹钟声音的方法
private void playAlarmSound() {
// 获取默认闹钟铃声的Uri
Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM);
// 根据系统设置判断是否在静音模式下播放闹钟声音
int silentModeStreams = Settings.System.getInt(getContentResolver(),
Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0);
@ -100,39 +117,33 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD
mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
}
try {
mPlayer.setDataSource(this, url);
mPlayer.prepare();
mPlayer.setLooping(true);
mPlayer.start();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
mPlayer.setDataSource(this, url); // 设置数据源
mPlayer.prepare(); // 准备播放
mPlayer.setLooping(true); // 设置循环播放
mPlayer.start(); // 开始播放
} catch (IllegalArgumentException | SecurityException | IllegalStateException | IOException e) {
e.printStackTrace();
}
}
// 显示操作对话框的方法
private void showActionDialog() {
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
dialog.setTitle(R.string.app_name);
dialog.setMessage(mSnippet);
dialog.setPositiveButton(R.string.notealert_ok, this);
dialog.setTitle(R.string.app_name); // 设置对话框标题
dialog.setMessage(mSnippet); // 设置对话框消息
dialog.setPositiveButton(R.string.notealert_ok, this); // 设置确定按钮
// 如果屏幕已开启,则设置编辑按钮
if (isScreenOn()) {
dialog.setNegativeButton(R.string.notealert_enter, this);
}
dialog.show().setOnDismissListener(this);
dialog.show().setOnDismissListener(this); // 显示对话框,并设置对话框消失监听器
}
// 实现OnClickListener接口的方法处理按钮点击事件
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case DialogInterface.BUTTON_NEGATIVE:
// 如果点击编辑按钮则启动NoteEditActivity
Intent intent = new Intent(this, NoteEditActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.putExtra(Intent.EXTRA_UID, mNoteId);
@ -143,16 +154,18 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD
}
}
// 实现OnDismissListener接口的方法处理对话框消失事件
public void onDismiss(DialogInterface dialog) {
stopAlarmSound();
finish();
stopAlarmSound(); // 停止闹钟声音
finish(); // 结束Activity
}
// 停止闹钟声音的方法
private void stopAlarmSound() {
if (mPlayer != null) {
mPlayer.stop();
mPlayer.release();
mPlayer = null;
mPlayer.stop(); // 停止播放
mPlayer.release(); // 释放资源
mPlayer = null; // 置空引用
}
}
}
}

@ -14,6 +14,12 @@
* limitations under the License.
*/
/*
* @author
* @time 2024520
* take a look便便ID
*/
package net.micode.notes.ui;
import android.app.AlarmManager;
@ -28,38 +34,54 @@ import net.micode.notes.data.Notes;
import net.micode.notes.data.Notes.NoteColumns;
// 定义AlarmInitReceiver类继承自BroadcastReceiver类
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; // 笔记提醒日期列索引
// onReceive方法当接收到广播时调用
@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
.getSystemService(Context.ALARM_SERVICE);
alermManager.set(AlarmManager.RTC_WAKEUP, alertDate, pendingIntent);
} while (c.moveToNext());
// 获取AlarmManager服务
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
// 设置一次性闹钟RTC_WAKEUP表示使用实际时间
alarmManager.set(AlarmManager.RTC_WAKEUP, alertDate, pendingIntent);
} while (c.moveToNext()); // 继续遍历
}
c.close();
c.close(); // 关闭游标
}
}
}
}

@ -14,17 +14,31 @@
* limitations under the License.
*/
/*
* @author
* @time 2024520
* AlarmAlertActivity
* */
package net.micode.notes.ui;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
// 定义AlarmReceiver类继承自BroadcastReceiver类
public class AlarmReceiver extends BroadcastReceiver {
// onReceive方法当接收到闹钟提醒的广播时调用
@Override
public void onReceive(Context context, Intent intent) {
// 设置Intent的类指定要启动的Activity
intent.setClass(context, AlarmAlertActivity.class);
// 为Intent添加标志表示这个Intent用于启动一个新的任务栈
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// 使用context启动AlarmAlertActivity
context.startActivity(intent);
}
}
}

@ -14,6 +14,12 @@
* limitations under the License.
*/
/*
* @author
* @time 2024520
*
* */
package net.micode.notes.ui;
import java.text.DateFormatSymbols;
@ -32,6 +38,7 @@ public class DateTimePicker extends FrameLayout {
private static final boolean DEFAULT_ENABLE_STATE = true;
// 定义了一些用于NumberPicker的常量
private static final int HOURS_IN_HALF_DAY = 12;
private static final int HOURS_IN_ALL_DAY = 24;
private static final int DAYS_IN_ALL_WEEK = 7;
@ -46,6 +53,7 @@ public class DateTimePicker extends FrameLayout {
private static final int AMPM_SPINNER_MIN_VAL = 0;
private static final int AMPM_SPINNER_MAX_VAL = 1;
// 成员变量
private final NumberPicker mDateSpinner;
private final NumberPicker mHourSpinner;
private final NumberPicker mMinuteSpinner;
@ -64,49 +72,65 @@ public class DateTimePicker extends FrameLayout {
private OnDateTimeChangedListener mOnDateTimeChangedListener;
// 定义日期选择器的值变化监听器
private NumberPicker.OnValueChangeListener mOnDateChangedListener = new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
// 当日期选择器的值发生变化时,更新日历日期
mDate.add(Calendar.DAY_OF_YEAR, newVal - oldVal);
// 更新日期控制显示
updateDateControl();
// 通知日期时间变化的监听器
onDateTimeChanged();
}
};
// 定义小时选择器的值变化监听器
private NumberPicker.OnValueChangeListener mOnHourChangedListener = new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
boolean isDateChanged = false;
Calendar cal = Calendar.getInstance();
boolean isDateChanged = false; // 标记日期是否改变
Calendar cal = Calendar.getInstance(); // 获取日历实例
// 如果不是24小时制
if (!mIs24HourView) {
// 当从下午的最后一个小时滚动到上午的第一个小时,或者相反时,日期需要改变
if (!mIsAm && oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY) {
// 从下午转到上午,日期加一天
cal.setTimeInMillis(mDate.getTimeInMillis());
cal.add(Calendar.DAY_OF_YEAR, 1);
isDateChanged = true;
} else if (mIsAm && oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1) {
// 从上午转到下午,日期减一天
cal.setTimeInMillis(mDate.getTimeInMillis());
cal.add(Calendar.DAY_OF_YEAR, -1);
isDateChanged = true;
}
// 当从下午转到上午或者相反时,更新上午/下午状态
if (oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY ||
oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1) {
mIsAm = !mIsAm;
updateAmPmControl();
mIsAm = !mIsAm; // 切换上午/下午状态
updateAmPmControl(); // 更新上午/下午显示
}
} else {
// 如果是24小时制当滚动到一天的开始或结束时日期需要改变
if (oldVal == HOURS_IN_ALL_DAY - 1 && newVal == 0) {
// 从一天的最后一个小时转到第一个小时,日期加一天
cal.setTimeInMillis(mDate.getTimeInMillis());
cal.add(Calendar.DAY_OF_YEAR, 1);
isDateChanged = true;
} else if (oldVal == 0 && newVal == HOURS_IN_ALL_DAY - 1) {
// 从一天的第一个小时转到最后一个小时,日期减一天
cal.setTimeInMillis(mDate.getTimeInMillis());
cal.add(Calendar.DAY_OF_YEAR, -1);
isDateChanged = true;
}
}
// 更新小时并根据12小时制或24小时制做相应调整
int newHour = mHourSpinner.getValue() % HOURS_IN_HALF_DAY + (mIsAm ? 0 : HOURS_IN_HALF_DAY);
mDate.set(Calendar.HOUR_OF_DAY, newHour);
// 通知日期时间变化的监听器
onDateTimeChanged();
// 如果日期改变,更新年月日
if (isDateChanged) {
setCurrentYear(cal.get(Calendar.YEAR));
setCurrentMonth(cal.get(Calendar.MONTH));
@ -115,21 +139,27 @@ public class DateTimePicker extends FrameLayout {
}
};
// 定义分钟选择器的值变化监听器
private NumberPicker.OnValueChangeListener mOnMinuteChangedListener = new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
// 当分钟选择器的值发生变化时,检查是否需要调整小时
int minValue = mMinuteSpinner.getMinValue();
int maxValue = mMinuteSpinner.getMaxValue();
int offset = 0;
if (oldVal == maxValue && newVal == minValue) {
// 如果从分钟的最大值滚动到最小值,小时加一
offset += 1;
} else if (oldVal == minValue && newVal == maxValue) {
// 如果从分钟的最小值滚动到最大值,小时减一
offset -= 1;
}
if (offset != 0) {
// 调整日期或时间
mDate.add(Calendar.HOUR_OF_DAY, offset);
mHourSpinner.setValue(getCurrentHour());
updateDateControl();
// 更新上午/下午状态
int newHour = getCurrentHourOfDay();
if (newHour >= HOURS_IN_HALF_DAY) {
mIsAm = false;
@ -139,38 +169,50 @@ public class DateTimePicker extends FrameLayout {
updateAmPmControl();
}
}
// 更新分钟
mDate.set(Calendar.MINUTE, newVal);
// 通知日期时间变化的监听器
onDateTimeChanged();
}
};
// 定义上午/下午选择器的值变化监听器
private NumberPicker.OnValueChangeListener mOnAmPmChangedListener = new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
// 当上午/下午选择器的值发生变化时,切换上午/下午状态并调整时间
mIsAm = !mIsAm;
if (mIsAm) {
// 如果切换到上午时间减去12小时
mDate.add(Calendar.HOUR_OF_DAY, -HOURS_IN_HALF_DAY);
} else {
// 如果切换到下午时间加上12小时
mDate.add(Calendar.HOUR_OF_DAY, HOURS_IN_HALF_DAY);
}
// 更新上午/下午显示
updateAmPmControl();
// 通知日期时间变化的监听器
onDateTimeChanged();
}
};
// 定义了一个内部接口,用于日期时间改变时的回调
public interface OnDateTimeChangedListener {
void onDateTimeChanged(DateTimePicker view, int year, int month,
int dayOfMonth, int hourOfDay, int minute);
int dayOfMonth, int hourOfDay, int minute);
}
// DateTimePicker的构造函数
public DateTimePicker(Context context) {
this(context, System.currentTimeMillis());
}
// 带日期参数的构造函数
public DateTimePicker(Context context, long date) {
this(context, date, DateFormat.is24HourFormat(context));
}
// 带日期和是否24小时制参数的构造函数
public DateTimePicker(Context context, long date, boolean is24HourView) {
super(context);
mDate = Calendar.getInstance();
@ -214,6 +256,7 @@ public class DateTimePicker extends FrameLayout {
mInitialising = false;
}
// 重写setEnabled方法用于启用/禁用DateTimePicker
@Override
public void setEnabled(boolean enabled) {
if (mIsEnabled == enabled) {
@ -227,6 +270,7 @@ public class DateTimePicker extends FrameLayout {
mIsEnabled = enabled;
}
// 重写isEnabled方法返回DateTimePicker的启用状态
@Override
public boolean isEnabled() {
return mIsEnabled;
@ -237,6 +281,7 @@ public class DateTimePicker extends FrameLayout {
*
* @return the current date in millis
*/
// 获取当前日期(毫秒)
public long getCurrentDateInTimeMillis() {
return mDate.getTimeInMillis();
}
@ -246,6 +291,7 @@ public class DateTimePicker extends FrameLayout {
*
* @param date The current date in millis
*/
// 设置当前日期(毫秒)
public void setCurrentDate(long date) {
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(date);
@ -262,8 +308,9 @@ public class DateTimePicker extends FrameLayout {
* @param hourOfDay The current hourOfDay
* @param minute The current minute
*/
// 设置当前日期(年、月、日、小时、分钟)
public void setCurrentDate(int year, int month,
int dayOfMonth, int hourOfDay, int minute) {
int dayOfMonth, int hourOfDay, int minute) {
setCurrentYear(year);
setCurrentMonth(month);
setCurrentDay(dayOfMonth);
@ -276,6 +323,7 @@ public class DateTimePicker extends FrameLayout {
*
* @return The current year
*/
// 以下是获取和设置当前年、月、日、小时、分钟的一系列方法
public int getCurrentYear() {
return mDate.get(Calendar.YEAR);
}
@ -422,6 +470,7 @@ public class DateTimePicker extends FrameLayout {
*
* @param is24HourView True for 24 hour mode. False for AM/PM mode.
*/
// 获取是否是24小时制
public void set24HourView(boolean is24HourView) {
if (mIs24HourView == is24HourView) {
return;
@ -434,6 +483,7 @@ public class DateTimePicker extends FrameLayout {
updateAmPmControl();
}
// 更新日期选择器的显示
private void updateDateControl() {
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(mDate.getTimeInMillis());
@ -448,6 +498,7 @@ public class DateTimePicker extends FrameLayout {
mDateSpinner.invalidate();
}
// 更新上午/下午选择器的显示
private void updateAmPmControl() {
if (mIs24HourView) {
mAmPmSpinner.setVisibility(View.GONE);
@ -458,6 +509,7 @@ public class DateTimePicker extends FrameLayout {
}
}
// 更新小时选择器的显示
private void updateHourControl() {
if (mIs24HourView) {
mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW);
@ -472,10 +524,12 @@ public class DateTimePicker extends FrameLayout {
* Set the callback that indicates the 'Set' button has been pressed.
* @param callback the callback, if null will do nothing
*/
// 设置日期时间改变的监听器
public void setOnDateTimeChangedListener(OnDateTimeChangedListener callback) {
mOnDateTimeChangedListener = callback;
}
// 通知日期时间改变的监听器
private void onDateTimeChanged() {
if (mOnDateTimeChangedListener != null) {
mOnDateTimeChangedListener.onDateTimeChanged(this, getCurrentYear(),

@ -0,0 +1,8 @@
## This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Fri May 31 08:12:59 CST 2024
sdk.dir=C\:\\Users\\Yourdestinystarts\\AppData\\Local\\Android\\Sdk
Loading…
Cancel
Save