From 4d7b2513a9eb42d6200a57ce5f4938e12882fd7f Mon Sep 17 00:00:00 2001 From: baiyang <2962673726@qq.com> Date: Mon, 22 Jan 2024 16:20:17 +0800 Subject: [PATCH] add --- .../micode/notes/ui/AlarmAlertActivity.java | 116 +++++++---- .../micode/notes/ui/AlarmInitReceiver.java | 41 ++-- .../net/micode/notes/ui/AlarmReceiver.java | 28 +-- .../net/micode/notes/ui/DateTimePicker.java | 180 +++++++++--------- .../micode/notes/ui/DateTimePickerDialog.java | 59 +++--- .../net/micode/notes/ui/DropdownMenu.java | 42 ++-- .../micode/notes/ui/FoldersListAdapter.java | 2 +- .../net/micode/notes/ui/NoteEditActivity.java | 2 +- .../net/micode/notes/ui/NoteEditText.java | 44 ++--- 9 files changed, 260 insertions(+), 254 deletions(-) diff --git a/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/AlarmAlertActivity.java b/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/AlarmAlertActivity.java index 85723be..e3327bd 100644 --- a/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/AlarmAlertActivity.java +++ b/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/AlarmAlertActivity.java @@ -1,21 +1,5 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - package net.micode.notes.ui; - + import android.app.Activity; import android.app.AlertDialog; import android.content.Context; @@ -32,68 +16,91 @@ import android.os.PowerManager; import android.provider.Settings; import android.view.Window; import android.view.WindowManager; - + import net.micode.notes.R; import net.micode.notes.data.Notes; import net.micode.notes.tool.DataUtils; - + import java.io.IOException; - - + public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener { - private long mNoteId; - private String mSnippet; + private long mNoteId; //文本在数据库存储中的ID号 + private String mSnippet; //闹钟提示时出现的文本片段 private static final int SNIPPET_PREW_MAX_LEN = 60; MediaPlayer mPlayer; - + @Override - protected void onCreate(Bundle savedInstanceState) { + protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + //Bundle类型的数据与Map类型的数据相似,都是以key-value的形式存储数据的 + //onsaveInstanceState方法是用来保存Activity的状态的 + //能从onCreate的参数savedInsanceState中获得状态数据 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 + //将窗体点亮 | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON + //允许窗体点亮时锁屏 | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR); - } - + }//在手机锁屏后如果到了闹钟提示时间,点亮屏幕 + Intent intent = getIntent(); - + try { mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1)); mSnippet = DataUtils.getSnippetById(this.getContentResolver(), mNoteId); + //根据ID从数据库中获取标签的内容; + //getContentResolver()是实现数据共享,实例存储。 mSnippet = mSnippet.length() > SNIPPET_PREW_MAX_LEN ? mSnippet.substring(0, SNIPPET_PREW_MAX_LEN) + getResources().getString(R.string.notelist_string_info) : mSnippet; + //判断标签片段是否达到符合长度 } catch (IllegalArgumentException e) { e.printStackTrace(); return; } - + /* + try + { + // 代码区 + } + catch(Exception e) + { + // 异常处理 + } + 代码区如果有错误,就会返回所写异常的处理。*/ mPlayer = new MediaPlayer(); if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) { showActionDialog(); + //弹出对话框 playAlarmSound(); + //闹钟提示音激发 } else { finish(); + //完成闹钟动作 } } - + private boolean isScreenOn() { + //判断屏幕是否锁屏,调用系统函数判断,最后返回值是布尔类型 PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); return pm.isScreenOn(); } - + private void playAlarmSound() { + //闹钟提示音激发 Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM); - + //调用系统的铃声管理URI,得到闹钟提示音 int silentModeStreams = Settings.System.getInt(getContentResolver(), Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0); - + if ((silentModeStreams & (1 << AudioManager.STREAM_ALARM)) != 0) { mPlayer.setAudioStreamType(silentModeStreams); } else { @@ -101,12 +108,19 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD } try { mPlayer.setDataSource(this, url); + //方法:setDataSource(Context context, Uri uri) + //解释:无返回值,设置多媒体数据来源【根据 Uri】 mPlayer.prepare(); + //准备同步 mPlayer.setLooping(true); + //设置是否循环播放 mPlayer.start(); + //开始播放 } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); + //e.printStackTrace()函数功能是抛出异常, 还将显示出更深的调用信息 + //System.out.println(e),这个方法打印出异常,并且输出在哪里出现的异常 } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); @@ -118,41 +132,61 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD e.printStackTrace(); } } - + private void showActionDialog() { AlertDialog.Builder dialog = new AlertDialog.Builder(this); + //AlertDialog的构造方法全部是Protected的 + //所以不能直接通过new一个AlertDialog来创建出一个AlertDialog。 + //要创建一个AlertDialog,就要用到AlertDialog.Builder中的create()方法 + //如这里的dialog就是新建了一个AlertDialog dialog.setTitle(R.string.app_name); + //为对话框设置标题 dialog.setMessage(mSnippet); + //为对话框设置内容 dialog.setPositiveButton(R.string.notealert_ok, this); + //给对话框添加"Yes"按钮 if (isScreenOn()) { dialog.setNegativeButton(R.string.notealert_enter, this); - } + }//对话框添加"No"按钮 dialog.show().setOnDismissListener(this); } - + public void onClick(DialogInterface dialog, int which) { switch (which) { + //用which来选择click后下一步的操作 case DialogInterface.BUTTON_NEGATIVE: + //这是取消操作 Intent intent = new Intent(this, NoteEditActivity.class); + //实现两个类间的数据传输 intent.setAction(Intent.ACTION_VIEW); + //设置动作属性 intent.putExtra(Intent.EXTRA_UID, mNoteId); + //实现key-value对 + //EXTRA_UID为key;mNoteId为键 startActivity(intent); + //开始动作 break; default: + //这是确定操作 break; } } - + public void onDismiss(DialogInterface dialog) { + //忽略 stopAlarmSound(); + //停止闹钟声音 finish(); + //完成该动作 } - + private void stopAlarmSound() { if (mPlayer != null) { mPlayer.stop(); + //停止播放 mPlayer.release(); + //释放MediaPlayer对象 mPlayer = null; } } -} +} \ No newline at end of file diff --git a/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java b/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java index f221202..353f4ae 100644 --- a/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java +++ b/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java @@ -1,21 +1,5 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - package net.micode.notes.ui; - + import android.app.AlarmManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; @@ -23,30 +7,34 @@ import android.content.ContentUris; import android.content.Context; import android.content.Intent; import android.database.Cursor; - + 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 }; - + //对数据库的操作,调用标签ID和闹钟时间 private static final int COLUMN_ID = 0; private static final int COLUMN_ALERTED_DATE = 1; - + @Override public void onReceive(Context context, Intent intent) { long currentDate = System.currentTimeMillis(); + //System.currentTimeMillis()产生一个当前的毫秒 + //这个毫秒其实就是自1970年1月1日0时起的毫秒数 Cursor c = context.getContentResolver().query(Notes.CONTENT_NOTE_URI, PROJECTION, NoteColumns.ALERTED_DATE + ">? AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE, new String[] { String.valueOf(currentDate) }, + //将long变量currentDate转化为字符串 null); - + //Cursor在这里的作用是通过查找数据库中的标签内容,找到和当前系统时间相等的标签 + if (c != null) { if (c.moveToFirst()) { do { @@ -61,5 +49,8 @@ public class AlarmInitReceiver extends BroadcastReceiver { } c.close(); } + //然而通过网上查找资料发现,对于闹钟机制的启动,通常需要上面的几个步骤 + //如新建Intent、PendingIntent以及AlarmManager等 + //这里就是根据数据库里的闹钟时间创建一个闹钟机制 } -} +} \ No newline at end of file diff --git a/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/AlarmReceiver.java b/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/AlarmReceiver.java index 54e503b..f35ed7b 100644 --- a/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/AlarmReceiver.java +++ b/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/AlarmReceiver.java @@ -1,30 +1,20 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - package net.micode.notes.ui; - + import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; - + public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - intent.setClass(context, AlarmAlertActivity.class); + intent.setClass(context, AlarmAlertActivity.class); + //启动AlarmAlertActivity intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + //activity要存在于activity的栈中,而非activity的途径启动activity时必然不存在一个activity的栈 + //所以要新起一个栈装入启动的activity context.startActivity(intent); } } +//这是实现alarm这个功能最接近用户层的包,基于上面的两个包, +//作用还需要深究但是对于setClass和addFlags的 + \ No newline at end of file diff --git a/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/DateTimePicker.java b/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/DateTimePicker.java index 496b0cd..c7fbbcd 100644 --- a/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/DateTimePicker.java +++ b/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/DateTimePicker.java @@ -1,37 +1,22 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - package net.micode.notes.ui; - + import java.text.DateFormatSymbols; import java.util.Calendar; - + import net.micode.notes.R; - - + + import android.content.Context; import android.text.format.DateFormat; import android.view.View; import android.widget.FrameLayout; import android.widget.NumberPicker; - + public class DateTimePicker extends FrameLayout { - + //FrameLayout是布局模板之一 + //所有的子元素全部在屏幕的右上方 private static final boolean DEFAULT_ENABLE_STATE = true; - + 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; @@ -45,25 +30,27 @@ public class DateTimePicker extends FrameLayout { private static final int MINUT_SPINNER_MAX_VAL = 59; 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; private final NumberPicker mAmPmSpinner; + //NumberPicker是数字选择器 + //这里定义的四个变量全部是在设置闹钟时需要选择的变量(如日期、时、分、上午或者下午) private Calendar mDate; - + //定义了Calendar类型的变量mDate,用于操作时间 private String[] mDateDisplayValues = new String[DAYS_IN_ALL_WEEK]; - + private boolean mIsAm; - + private boolean mIs24HourView; - + private boolean mIsEnabled = DEFAULT_ENABLE_STATE; - + private boolean mInitialising; - + private OnDateTimeChangedListener mOnDateTimeChangedListener; - + private NumberPicker.OnValueChangeListener mOnDateChangedListener = new NumberPicker.OnValueChangeListener() { @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { @@ -71,41 +58,49 @@ public class DateTimePicker extends FrameLayout { updateDateControl(); onDateTimeChanged(); } - }; - + };//OnValueChangeListener,这是时间改变监听器,这里主要是对日期的监听 + //将现在日期的值传递给mDate;updateDateControl是同步操作 + private NumberPicker.OnValueChangeListener mOnHourChangedListener = new NumberPicker.OnValueChangeListener() { - @Override + //这里是对 小时(Hour) 的监听 + @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { boolean isDateChanged = false; Calendar cal = Calendar.getInstance(); + //声明一个Calendar的变量cal,便于后续的操作 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; + //这里是对于12小时制时,晚上11点和12点交替时对日期的更改 } 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; - } + } + //这里是对于12小时制时,凌晨11点和12点交替时对日期的更改 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(); - } + }//这里是对于12小时制时,中午11点和12点交替时对AM和PM的更改 } else { if (oldVal == HOURS_IN_ALL_DAY - 1 && newVal == 0) { cal.setTimeInMillis(mDate.getTimeInMillis()); cal.add(Calendar.DAY_OF_YEAR, 1); isDateChanged = true; + //这里是对于24小时制时,晚上11点和12点交替时对日期的更改 } else if (oldVal == 0 && newVal == HOURS_IN_ALL_DAY - 1) { cal.setTimeInMillis(mDate.getTimeInMillis()); cal.add(Calendar.DAY_OF_YEAR, -1); isDateChanged = true; } - } + } //这里是对于12小时制时,凌晨11点和12点交替时对日期的更改 int newHour = mHourSpinner.getValue() % HOURS_IN_HALF_DAY + (mIsAm ? 0 : HOURS_IN_HALF_DAY); + //通过数字选择器对newHour的赋值 mDate.set(Calendar.HOUR_OF_DAY, newHour); + //通过set函数将新的Hour值传给mDate onDateTimeChanged(); if (isDateChanged) { setCurrentYear(cal.get(Calendar.YEAR)); @@ -114,18 +109,22 @@ public class DateTimePicker extends FrameLayout { } } }; - + private NumberPicker.OnValueChangeListener mOnMinuteChangedListener = new NumberPicker.OnValueChangeListener() { @Override + //这里是对 分钟(Minute)改变的监听 public void onValueChange(NumberPicker picker, int oldVal, int newVal) { int minValue = mMinuteSpinner.getMinValue(); int maxValue = mMinuteSpinner.getMaxValue(); int offset = 0; + //设置offset,作为小时改变的一个记录数据 if (oldVal == maxValue && newVal == minValue) { offset += 1; } else if (oldVal == minValue && newVal == maxValue) { offset -= 1; } + //如果原值为59,新值为0,则offset加1 + //如果原值为0,新值为59,则offset减1 if (offset != 0) { mDate.add(Calendar.HOUR_OF_DAY, offset); mHourSpinner.setValue(getCurrentHour()); @@ -143,9 +142,10 @@ public class DateTimePicker extends FrameLayout { onDateTimeChanged(); } }; - + private NumberPicker.OnValueChangeListener mOnAmPmChangedListener = new NumberPicker.OnValueChangeListener() { - @Override + //对AM和PM的监听 + @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { mIsAm = !mIsAm; if (mIsAm) { @@ -157,63 +157,66 @@ public class DateTimePicker extends FrameLayout { onDateTimeChanged(); } }; - + public interface OnDateTimeChangedListener { void onDateTimeChanged(DateTimePicker view, int year, int month, int dayOfMonth, int hourOfDay, int minute); } - + public DateTimePicker(Context context) { this(context, System.currentTimeMillis()); - } - + }//通过对数据库的访问,获取当前的系统时间 + public DateTimePicker(Context context, long date) { this(context, date, DateFormat.is24HourFormat(context)); - } - + }//上面函数的得到的是一个天文数字(1970至今的秒数),需要DateFormat将其变得有意义 + public DateTimePicker(Context context, long date, boolean is24HourView) { super(context); + //获取系统时间 mDate = Calendar.getInstance(); mInitialising = true; mIsAm = getCurrentHourOfDay() >= HOURS_IN_HALF_DAY; inflate(context, R.layout.datetime_picker, this); - + //如果当前Activity里用到别的layout,比如对话框layout + //还要设置这个layout上的其他组件的内容,就必须用inflate()方法先将对话框的layout找出来 + //然后再用findViewById()找到它上面的其它组件 mDateSpinner = (NumberPicker) findViewById(R.id.date); mDateSpinner.setMinValue(DATE_SPINNER_MIN_VAL); mDateSpinner.setMaxValue(DATE_SPINNER_MAX_VAL); mDateSpinner.setOnValueChangedListener(mOnDateChangedListener); - + mHourSpinner = (NumberPicker) findViewById(R.id.hour); mHourSpinner.setOnValueChangedListener(mOnHourChangedListener); - mMinuteSpinner = (NumberPicker) findViewById(R.id.minute); - mMinuteSpinner.setMinValue(MINUT_SPINNER_MIN_VAL); + mMinuteSpinner = (NumberPicker) findViewById(R.id.minute); + mMinuteSpinner.setMinValue(MINUT_SPINNER_MIN_VAL); mMinuteSpinner.setMaxValue(MINUT_SPINNER_MAX_VAL); mMinuteSpinner.setOnLongPressUpdateInterval(100); mMinuteSpinner.setOnValueChangedListener(mOnMinuteChangedListener); - + String[] stringsForAmPm = new DateFormatSymbols().getAmPmStrings(); mAmPmSpinner = (NumberPicker) findViewById(R.id.amPm); mAmPmSpinner.setMinValue(AMPM_SPINNER_MIN_VAL); mAmPmSpinner.setMaxValue(AMPM_SPINNER_MAX_VAL); mAmPmSpinner.setDisplayedValues(stringsForAmPm); mAmPmSpinner.setOnValueChangedListener(mOnAmPmChangedListener); - + // update controls to initial state updateDateControl(); updateHourControl(); updateAmPmControl(); - + set24HourView(is24HourView); - + // set to current time setCurrentDate(date); - + setEnabled(isEnabled()); - + // set the content descriptions mInitialising = false; } - + @Override public void setEnabled(boolean enabled) { if (mIsEnabled == enabled) { @@ -226,12 +229,14 @@ public class DateTimePicker extends FrameLayout { mAmPmSpinner.setEnabled(enabled); mIsEnabled = enabled; } - + //存在疑问!!!!!!!!!!!!!setEnabled的作用 + //下面的代码通过原程序的注释已经比较清晰,另外可以通过函数名来判断 + //下面的各函数主要是对上面代码引用到的各函数功能的实现 @Override public boolean isEnabled() { return mIsEnabled; } - + /** * Get the current date in millis * @@ -239,8 +244,8 @@ public class DateTimePicker extends FrameLayout { */ public long getCurrentDateInTimeMillis() { return mDate.getTimeInMillis(); - } - + }//实现函数——得到当前的秒数 + /** * Set the current date * @@ -251,8 +256,8 @@ public class DateTimePicker extends FrameLayout { cal.setTimeInMillis(date); setCurrentDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE)); - } - + }//实现函数功能——设置当前的时间,参数是date + /** * Set the current date * @@ -269,17 +274,18 @@ public class DateTimePicker extends FrameLayout { setCurrentDay(dayOfMonth); setCurrentHour(hourOfDay); setCurrentMinute(minute); - } - + }//实现函数功能——设置当前的时间,参数是各详细的变量 + /** * Get current year * * @return The current year */ + //下面是得到year、month、day等值 public int getCurrentYear() { return mDate.get(Calendar.YEAR); } - + /** * Set current year * @@ -293,7 +299,7 @@ public class DateTimePicker extends FrameLayout { updateDateControl(); onDateTimeChanged(); } - + /** * Get current month in the year * @@ -302,7 +308,7 @@ public class DateTimePicker extends FrameLayout { public int getCurrentMonth() { return mDate.get(Calendar.MONTH); } - + /** * Set current month in the year * @@ -316,7 +322,7 @@ public class DateTimePicker extends FrameLayout { updateDateControl(); onDateTimeChanged(); } - + /** * Get current day of the month * @@ -325,7 +331,7 @@ public class DateTimePicker extends FrameLayout { public int getCurrentDay() { return mDate.get(Calendar.DAY_OF_MONTH); } - + /** * Set current day of the month * @@ -339,7 +345,7 @@ public class DateTimePicker extends FrameLayout { updateDateControl(); onDateTimeChanged(); } - + /** * Get current hour in 24 hour mode, in the range (0~23) * @return The current hour in 24 hour mode @@ -347,7 +353,7 @@ public class DateTimePicker extends FrameLayout { public int getCurrentHourOfDay() { return mDate.get(Calendar.HOUR_OF_DAY); } - + private int getCurrentHour() { if (mIs24HourView){ return getCurrentHourOfDay(); @@ -360,7 +366,7 @@ public class DateTimePicker extends FrameLayout { } } } - + /** * Set current hour in 24 hour mode, in the range (0~23) * @@ -388,7 +394,7 @@ public class DateTimePicker extends FrameLayout { mHourSpinner.setValue(hourOfDay); onDateTimeChanged(); } - + /** * Get currentMinute * @@ -397,7 +403,7 @@ public class DateTimePicker extends FrameLayout { public int getCurrentMinute() { return mDate.get(Calendar.MINUTE); } - + /** * Set current minute */ @@ -409,14 +415,14 @@ public class DateTimePicker extends FrameLayout { mDate.set(Calendar.MINUTE, minute); onDateTimeChanged(); } - + /** * @return true if this is in 24 hour view else false. */ public boolean is24HourView () { return mIs24HourView; } - + /** * Set whether in 24 hour or AM/PM mode. * @@ -433,7 +439,7 @@ public class DateTimePicker extends FrameLayout { setCurrentHour(hour); updateAmPmControl(); } - + private void updateDateControl() { Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(mDate.getTimeInMillis()); @@ -446,8 +452,8 @@ public class DateTimePicker extends FrameLayout { mDateSpinner.setDisplayedValues(mDateDisplayValues); mDateSpinner.setValue(DAYS_IN_ALL_WEEK / 2); mDateSpinner.invalidate(); - } - + }// 对于星期几的算法 + private void updateAmPmControl() { if (mIs24HourView) { mAmPmSpinner.setVisibility(View.GONE); @@ -455,9 +461,9 @@ public class DateTimePicker extends FrameLayout { int index = mIsAm ? Calendar.AM : Calendar.PM; mAmPmSpinner.setValue(index); mAmPmSpinner.setVisibility(View.VISIBLE); - } + }// 对于上下午操作的算法 } - + private void updateHourControl() { if (mIs24HourView) { mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW); @@ -465,9 +471,9 @@ public class DateTimePicker extends FrameLayout { } else { mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW); mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW); - } + }// 对与小时的算法 } - + /** * Set the callback that indicates the 'Set' button has been pressed. * @param callback the callback, if null will do nothing @@ -475,11 +481,11 @@ public class DateTimePicker extends FrameLayout { public void setOnDateTimeChangedListener(OnDateTimeChangedListener callback) { mOnDateTimeChangedListener = callback; } - + private void onDateTimeChanged() { if (mOnDateTimeChangedListener != null) { mOnDateTimeChangedListener.onDateTimeChanged(this, getCurrentYear(), getCurrentMonth(), getCurrentDay(), getCurrentHourOfDay(), getCurrentMinute()); - } + } } -} +} \ No newline at end of file diff --git a/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/DateTimePickerDialog.java b/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/DateTimePickerDialog.java index 2c47ba4..c11de32 100644 --- a/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/DateTimePickerDialog.java +++ b/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/DateTimePickerDialog.java @@ -1,49 +1,40 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - package net.micode.notes.ui; - + import java.util.Calendar; - + import net.micode.notes.R; import net.micode.notes.ui.DateTimePicker; import net.micode.notes.ui.DateTimePicker.OnDateTimeChangedListener; - + import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.text.format.DateFormat; import android.text.format.DateUtils; - + public class DateTimePickerDialog extends AlertDialog implements OnClickListener { - + private Calendar mDate = Calendar.getInstance(); + //创建一个Calendar类型的变量 mDate,方便时间的操作 private boolean mIs24HourView; private OnDateTimeSetListener mOnDateTimeSetListener; + //声明一个时间日期滚动选择控件 mOnDateTimeSetListener private DateTimePicker mDateTimePicker; - + //DateTimePicker控件,控件一般用于让用户可以从日期列表中选择单个值。 + //运行时,单击控件边上的下拉箭头,会显示为两个部分:一个下拉列表,一个用于选择日期的 + public interface OnDateTimeSetListener { void OnDateTimeSet(AlertDialog dialog, long date); } - + public DateTimePickerDialog(Context context, long date) { + //对该界面对话框的实例化 super(context); + //对数据库的操作 mDateTimePicker = new DateTimePicker(context); setView(mDateTimePicker); + //添加一个子视图 mDateTimePicker.setOnDateTimeChangedListener(new OnDateTimeChangedListener() { public void onDateTimeChanged(DateTimePicker view, int year, int month, int dayOfMonth, int hourOfDay, int minute) { @@ -52,26 +43,31 @@ public class DateTimePickerDialog extends AlertDialog implements OnClickListener mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); mDate.set(Calendar.HOUR_OF_DAY, hourOfDay); mDate.set(Calendar.MINUTE, minute); + //将视图中的各选项设置为系统当前时间 updateTitle(mDate.getTimeInMillis()); } }); mDate.setTimeInMillis(date); + //得到系统时间 mDate.set(Calendar.SECOND, 0); + //将秒数设置为0 mDateTimePicker.setCurrentDate(mDate.getTimeInMillis()); setButton(context.getString(R.string.datetime_dialog_ok), this); setButton2(context.getString(R.string.datetime_dialog_cancel), (OnClickListener)null); + //设置按钮 set24HourView(DateFormat.is24HourFormat(this.getContext())); + //时间标准化打印 updateTitle(mDate.getTimeInMillis()); } - + public void set24HourView(boolean is24HourView) { mIs24HourView = is24HourView; } - + public void setOnDateTimeSetListener(OnDateTimeSetListener callBack) { mOnDateTimeSetListener = callBack; - } - + }//将时间日期滚动选择控件实例化 + private void updateTitle(long date) { int flag = DateUtils.FORMAT_SHOW_YEAR | @@ -79,12 +75,13 @@ public class DateTimePickerDialog extends AlertDialog implements OnClickListener DateUtils.FORMAT_SHOW_TIME; flag |= mIs24HourView ? DateUtils.FORMAT_24HOUR : DateUtils.FORMAT_24HOUR; setTitle(DateUtils.formatDateTime(this.getContext(), date, flag)); - } - + }//android开发中常见日期管理工具类(API)——DateUtils:按照上下午显示时间 + public void onClick(DialogInterface arg0, int arg1) { if (mOnDateTimeSetListener != null) { mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis()); } - } - + }//第一个参数arg0是接收到点击事件的对话框 + //第二个参数arg1是该对话框上的按钮 + } \ No newline at end of file diff --git a/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/DropdownMenu.java b/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/DropdownMenu.java index 613dc74..4c4cf90 100644 --- a/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/DropdownMenu.java +++ b/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/DropdownMenu.java @@ -1,21 +1,5 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - package net.micode.notes.ui; - + import android.content.Context; import android.view.Menu; import android.view.MenuItem; @@ -24,38 +8,42 @@ import android.view.View.OnClickListener; import android.widget.Button; import android.widget.PopupMenu; import android.widget.PopupMenu.OnMenuItemClickListener; - + import net.micode.notes.R; - + public class DropdownMenu { private Button mButton; private PopupMenu mPopupMenu; + //声明一个下拉菜单 private Menu mMenu; - + public DropdownMenu(Context context, Button button, int menuId) { mButton = button; mButton.setBackgroundResource(R.drawable.dropdown_icon); + //设置这个view的背景 mPopupMenu = new PopupMenu(context, mButton); mMenu = mPopupMenu.getMenu(); mPopupMenu.getMenuInflater().inflate(menuId, mMenu); + //MenuInflater是用来实例化Menu目录下的Menu布局文件 + //根据ID来确认menu的内容选项 mButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { mPopupMenu.show(); } }); } - + public void setOnDropdownMenuItemClickListener(OnMenuItemClickListener listener) { if (mPopupMenu != null) { mPopupMenu.setOnMenuItemClickListener(listener); - } + }//设置菜单的监听 } - + public MenuItem findItem(int id) { return mMenu.findItem(id); - } - + }//对于菜单选项的初始化,根据索引搜索菜单需要的选项 + public void setTitle(CharSequence title) { mButton.setText(title); - } -} + }//布局文件,设置标题 +} \ No newline at end of file diff --git a/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/FoldersListAdapter.java b/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/FoldersListAdapter.java index 9fdba5b..4fbe285 100644 --- a/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/FoldersListAdapter.java +++ b/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/FoldersListAdapter.java @@ -68,4 +68,4 @@ public class FoldersListAdapter extends CursorAdapter { } } -} +} \ No newline at end of file diff --git a/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java b/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java index 3b98c60..35c9bad 100644 --- a/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java +++ b/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java @@ -1064,4 +1064,4 @@ public class NoteEditActivity extends Activity implements OnClickListener, private void showToast(int resId, int duration) { Toast.makeText(this, resId, duration).show(); } -} +} \ No newline at end of file diff --git a/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/NoteEditText.java b/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/NoteEditText.java index 4c87482..fa3db89 100644 --- a/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/NoteEditText.java +++ b/src/MiNotes-master/app/src/main/java/net/micode/notes/ui/NoteEditText.java @@ -1,5 +1,5 @@ package net.micode.notes.ui; - + import android.content.Context; import android.graphics.Rect; import android.text.Layout; @@ -15,18 +15,18 @@ import android.view.MenuItem; import android.view.MenuItem.OnMenuItemClickListener; import android.view.MotionEvent; import android.widget.EditText; - + import net.micode.notes.R; - + import java.util.HashMap; import java.util.Map; - + //继承edittext,设置便签设置文本框 public class NoteEditText extends EditText { private static final String TAG = "NoteEditText"; private int mIndex; private int mSelectionStartBeforeDelete; - + private static final String SCHEME_TEL = "tel:" ; private static final String SCHEME_HTTP = "http:" ; private static final String SCHEME_EMAIL = "mailto:" ; @@ -38,7 +38,7 @@ public class NoteEditText extends EditText { sSchemaActionResMap.put(SCHEME_HTTP, R.string.note_link_web); sSchemaActionResMap.put(SCHEME_EMAIL, R.string.note_link_email); } - + /** * Call by the {@link NoteEditActivity} to delete or add edit text */ @@ -50,28 +50,28 @@ public class NoteEditText extends EditText { */ //处理删除按键时的操作 void onEditTextDelete(int index, String text); - + /** * Add edit text after current edit text when {@link KeyEvent#KEYCODE_ENTER} * happen */ //处理进入按键时的操作 void onEditTextEnter(int index, String text); - + /** * Hide or show item option when text change */ void onTextChange(int index, boolean hasText); } - + private OnTextViewChangeListener mOnTextViewChangeListener; - + //根据context设置文本 public NoteEditText(Context context) { super(context, null);//用super引用父类变量 mIndex = 0; } - + //设置当前光标 public void setIndex(int index) { mIndex = index; @@ -81,19 +81,19 @@ public class NoteEditText extends EditText { public void setOnTextViewChangeListener(OnTextViewChangeListener listener) { mOnTextViewChangeListener = listener; } - + //AttributeSet 百度了一下是自定义空控件属性,用于维护便签动态变化的属性 //初始化便签 public NoteEditText(Context context, AttributeSet attrs) { super(context, attrs, android.R.attr.editTextStyle); } - + // 根据defstyle自动初始化 public NoteEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated construct or stub } - + @Override //view里的函数,处理手机屏幕的所有事件 /*参数event为手机屏幕触摸事件封装类的对象,其中封装了该事件的所有信息, @@ -119,10 +119,10 @@ public class NoteEditText extends EditText { Selection.setSelection(getText(), off); break; } - + return super.onTouchEvent(event); } - + @Override /* * 函数功能:处理用户按下一个键盘按键时会触发 的事件 @@ -147,7 +147,7 @@ public class NoteEditText extends EditText { //继续执行父类的其他点击事件 return super.onKeyDown(keyCode, event); } - + @Override /* * 函数功能:处理用户松开一个键盘按键时会触发 的事件 @@ -192,7 +192,7 @@ public class NoteEditText extends EditText { //继续执行父类的其他按键弹起的事件 return super.onKeyUp(keyCode, event); } - + @Override /* * 函数功能:当焦点发生变化时,会自动调用该方法来处理焦点改变的事件 @@ -216,7 +216,7 @@ public class NoteEditText extends EditText { //继续执行父类的其他焦点变化的事件 super.onFocusChanged(focused, direction, previouslyFocusedRect); } - + @Override /* * 函数功能:生成上下文菜单 @@ -228,7 +228,7 @@ public class NoteEditText extends EditText { int selStart = getSelectionStart(); int selEnd = getSelectionEnd(); //获取文本开始和结尾位置 - + int min = Math.min(selStart, selEnd); int max = Math.max(selStart, selEnd); //获取开始到结尾的最大值和最小值 @@ -245,12 +245,12 @@ public class NoteEditText extends EditText { break; } } - + if (defaultResId == 0) { //defaultResId == 0则说明url并没有添加任何东西,所以置为连接其他SchemaActionResMap的值 defaultResId = R.string.note_link_other; } - + //建立菜单 menu.add(0, 0, 0, defaultResId).setOnMenuItemClickListener( new OnMenuItemClickListener() {