12.23添加

曾晨曦_branch
zcx 2 years ago
parent e5572d51b9
commit 9f451086c2

@ -75,15 +75,14 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD
*/
try {
mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1));
mSnippet = DataUtils.getSnippetById(this.getContentResolver(), mNoteId);
//根据ID从数据库中获取标签的内容
//getContentResolver是实现数据共享实例存储。
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;
//判断标签片段是否达到符合长度
: mSnippet;//判断标签片段是否达到符合长度
} catch (IllegalArgumentException e) {
e.printStackTrace();
e.printStackTrace();//打印出异常,并且输出在哪里出现的异常
return;
}

@ -35,8 +35,8 @@ public class AlarmInitReceiver extends BroadcastReceiver {
NoteColumns.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;//设置时间常量
//Broadcast Receiver是Android中的四大组件之一。 AlarmInitReceiver的配置“android.intent.action.BOOT_COMPLETED”表明
//Android手机开机后会发送android.intent.action.BOOT_COMPLETED广播监听这个广播就能监听开机。
@ -68,7 +68,7 @@ public class AlarmInitReceiver extends BroadcastReceiver {
}
c.close();
}
//通过网上查找资料发现,对于闹钟机制的启动,通常需要上面的几个步骤
//通过查找资料发现,对于闹钟机制的启动,通常需要上面的几个步骤
//如新建Intent、PendingIntent以及AlarmManager等
}
}

@ -20,14 +20,15 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
//功能:接收闹钟触发的广播接收器
//实现接收到闹钟触发的广播时被调用在onReceive方法中我们可以执行操作
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
intent.setClass(context, AlarmAlertActivity.class); //启动AlarmAlertActivity
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//activity要存在于activity的栈中而非activity的途径启动activity时必然不存在一个activity的栈
//所以要新起一个栈装入启动的activity
context.startActivity(intent);
context.startActivity(intent);//activity要存在于activity的栈中而非activity的途径启动activity时必然不存在一个activity的栈所以要新起一个栈装入启动的activity
}
}

@ -19,6 +19,7 @@ package net.micode.notes.ui;
import java.text.DateFormatSymbols;
import java.util.Calendar;
import net.micode.notes.R;
import net.micode.notes.ui.DateTimePicker.OnDateTimeChangedListener;
import android.content.Context;
import android.text.format.DateFormat;
import android.view.View;
@ -142,21 +143,24 @@ public class DateTimePicker extends FrameLayout {
}
//hour改变对日期的影响
// 如果偏移量不为零,则通过添加偏移量(以小时为单位)来调整日期
if (offset != 0) {
mDate.add(Calendar.HOUR_OF_DAY, offset);
mHourSpinner.setValue(getCurrentHour());
updateDateControl();
mDate.add(Calendar.HOUR_OF_DAY, offset);// 更新小时选择器以反映当前小时
mHourSpinner.setValue(getCurrentHour());// 根据更改更新日期控件
updateDateControl();// 获取调整后的新小时
int newHour = getCurrentHourOfDay();
// 检查新小时是否在一天的后半部分
if (newHour >= HOURS_IN_HALF_DAY) {
mIsAm = false;
updateAmPmControl();
mIsAm = false;// 将时间设置为下午
updateAmPmControl();// 更新上午/下午控件以反映更改
} else {
mIsAm = true;
updateAmPmControl();
}
}
mDate.set(Calendar.MINUTE, newVal);
onDateTimeChanged();
mDate.set(Calendar.MINUTE, newVal);// 将日期中的分钟设置为新值
onDateTimeChanged();//通知时间和日期已更改
}
};
@ -165,11 +169,11 @@ public class DateTimePicker extends FrameLayout {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
mIsAm = !mIsAm;
mIsAm = !mIsAm; // 切换上午和下午状态
if (mIsAm) {
mDate.add(Calendar.HOUR_OF_DAY, -HOURS_IN_HALF_DAY);
mDate.add(Calendar.HOUR_OF_DAY, -HOURS_IN_HALF_DAY);// 如果是上午,减去半天的小时数
} else {
mDate.add(Calendar.HOUR_OF_DAY, HOURS_IN_HALF_DAY);
mDate.add(Calendar.HOUR_OF_DAY, HOURS_IN_HALF_DAY);// 如果是下午,加上半天的小时数
}
updateAmPmControl();
onDateTimeChanged();
@ -249,12 +253,14 @@ public class DateTimePicker extends FrameLayout {
if (mIsEnabled == enabled) {
return;
}
// 设置日期、分钟、小时、上午/下午控件是否可用
super.setEnabled(enabled);
mDateSpinner.setEnabled(enabled);
mMinuteSpinner.setEnabled(enabled);
mHourSpinner.setEnabled(enabled);
mAmPmSpinner.setEnabled(enabled);
mIsEnabled = enabled;
mIsEnabled = enabled;// 更新控件状态
}
@ -322,12 +328,16 @@ public class DateTimePicker extends FrameLayout {
onDateTimeChanged();
}
/*
*
*/
public int getCurrentMonth() {
return mDate.get(Calendar.MONTH);
}
/*
*
*/
public void setCurrentMonth(int month) {
if (!mInitialising && month == getCurrentMonth()) {
return;
@ -337,12 +347,16 @@ public class DateTimePicker extends FrameLayout {
onDateTimeChanged();
}
/*
*
*/
public int getCurrentDay() {
return mDate.get(Calendar.DAY_OF_MONTH);
}
/*
*
*/
public void setCurrentDay(int dayOfMonth) {
if (!mInitialising && dayOfMonth == getCurrentDay()) {
return;
@ -352,54 +366,68 @@ public class DateTimePicker extends FrameLayout {
onDateTimeChanged();
}
/*
*
*/
public int getCurrentHourOfDay() {
return mDate.get(Calendar.HOUR_OF_DAY);
}
/*
*
*/
private int getCurrentHour() {
if (mIs24HourView){
return getCurrentHourOfDay();
return getCurrentHourOfDay();// 如果是24小时制直接返回当前小时
} else {
int hour = getCurrentHourOfDay();
if (hour > HOURS_IN_HALF_DAY) {
return hour - HOURS_IN_HALF_DAY;
return hour - HOURS_IN_HALF_DAY;// 如果当前小时大于半天的小时数,返回减去半天后的小时数
} else {
return hour == 0 ? HOURS_IN_HALF_DAY : hour;
return hour == 0 ? HOURS_IN_HALF_DAY : hour;// 如果当前小时为0则返回半天的小时数否则返回当前小时
}
}
}
/*
*
*/
//24小时制
public void setCurrentHour(int hourOfDay) {
// 如果不是初始化过程,并且要设置的小时等于当前小时,则不做任何操作
if (!mInitialising && hourOfDay == getCurrentHourOfDay()) {
return;
}
mDate.set(Calendar.HOUR_OF_DAY, hourOfDay);
mDate.set(Calendar.HOUR_OF_DAY, hourOfDay);// 将日期中的小时设置为新值
// 如果不是24小时制
if (!mIs24HourView) {
if (hourOfDay >= HOURS_IN_HALF_DAY) {
mIsAm = false;
mIsAm = false;// 设置为下午
if (hourOfDay > HOURS_IN_HALF_DAY) {
hourOfDay -= HOURS_IN_HALF_DAY;
hourOfDay -= HOURS_IN_HALF_DAY;// 如果大于半天的小时数,减去半天的小时数
}
} else {
mIsAm = true;
if (hourOfDay == 0) {
hourOfDay = HOURS_IN_HALF_DAY;
hourOfDay = HOURS_IN_HALF_DAY;// 如果小时为0设置为半天的小时数
}
}
updateAmPmControl();
}
mHourSpinner.setValue(hourOfDay);
mHourSpinner.setValue(hourOfDay); // 设置小时控件的值为新值
onDateTimeChanged();
}
/*
*
*/
public int getCurrentMinute() {
return mDate.get(Calendar.MINUTE);
}
/*
*
*/
public void setCurrentMinute(int minute) {
if (!mInitialising && minute == getCurrentMinute()) {
return;
@ -417,29 +445,30 @@ public class DateTimePicker extends FrameLayout {
public void set24HourView(boolean is24HourView) {
if (mIs24HourView == is24HourView) {
return;
return; // 如果当前24小时制状态与要设置的状态相同则不做任何操作
}
mIs24HourView = is24HourView;
mAmPmSpinner.setVisibility(is24HourView ? View.GONE : View.VISIBLE);
int hour = getCurrentHourOfDay();
updateHourControl();
setCurrentHour(hour);
updateAmPmControl();
mAmPmSpinner.setVisibility(is24HourView ? View.GONE : View.VISIBLE);// 根据24小时制状态设置上午/下午控件的可见性
int hour = getCurrentHourOfDay();// 获取当前小时
updateHourControl();// 更新小时控件
setCurrentHour(hour);// 设置当前小时
updateAmPmControl();// 更新上午/下午控件
}
// 对于星期几的算法
private void updateDateControl() {
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(mDate.getTimeInMillis());
cal.add(Calendar.DAY_OF_YEAR, -DAYS_IN_ALL_WEEK / 2 - 1);
mDateSpinner.setDisplayedValues(null);
cal.setTimeInMillis(mDate.getTimeInMillis());// 获取当前时间
cal.add(Calendar.DAY_OF_YEAR, -DAYS_IN_ALL_WEEK / 2 - 1);// 将时间向前推移半周减一天
mDateSpinner.setDisplayedValues(null);// 清空日期控件的显示值
// 遍历一周的日期
for (int i = 0; i < DAYS_IN_ALL_WEEK; ++i) {
cal.add(Calendar.DAY_OF_YEAR, 1);
mDateDisplayValues[i] = (String) DateFormat.format("MM.dd EEEE", cal);
mDateDisplayValues[i] = (String) DateFormat.format("MM.dd EEEE", cal);// 将日期格式化为"月.日 星期"的形式,并存入日期显示值数组
}
mDateSpinner.setDisplayedValues(mDateDisplayValues);
mDateSpinner.setValue(DAYS_IN_ALL_WEEK / 2);
mDateSpinner.invalidate();
mDateSpinner.setDisplayedValues(mDateDisplayValues); //设置日期控件的显示值为日期显示值数组
mDateSpinner.setValue(DAYS_IN_ALL_WEEK / 2);//设置日期控件的初始值为一周的中间位置
mDateSpinner.invalidate();// 使日期控件失效,以便刷新显示
}
// 对于AM\PM操作的算法
@ -454,10 +483,14 @@ public class DateTimePicker extends FrameLayout {
}
private void updateHourControl() {
//如果是24小时制
// 设置小时控件的最小值和最大值
if (mIs24HourView) {
mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW);
mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW);
} else {
// 如果是12小时制
// 设置小时控件的最小值和最大值
mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW);
mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW);
}
@ -468,11 +501,13 @@ public class DateTimePicker extends FrameLayout {
* @param callback null
*/
public void setOnDateTimeChangedListener(OnDateTimeChangedListener callback) {
mOnDateTimeChangedListener = callback;
mOnDateTimeChangedListener = callback;// 设置日期时间变化监听器的回调
}
// 当日期时间发生变化时触发回调
private void onDateTimeChanged() {
// 如果日期时间变化监听器不为空,则触发回调
if (mOnDateTimeChangedListener != null) {
// 通过回调通知当前年、月、日、小时、分钟的变化
mOnDateTimeChangedListener.onDateTimeChanged(this, getCurrentYear(),
getCurrentMonth(), getCurrentDay(), getCurrentHourOfDay(), getCurrentMinute());
}

@ -62,48 +62,57 @@ public class NotesListItem extends LinearLayout {
mItemData = data;
//下面的语句块设置控件属性一共三种情况由data的id和父id是否与保存到文件夹的id一致来决定
if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) {
mCallName.setVisibility(View.GONE);
mAlert.setVisibility(View.VISIBLE);
mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem);//设置该textview的style
mTitle.setText(context.getString(R.string.call_record_folder_name)
+ context.getString(R.string.format_folder_files_count, data.getNotesCount()));//settext为设置内容
mAlert.setImageResource(R.drawable.call_record);
//下面的语句块设置控件属性一共三种情况由data的id和父id是否与保存到文件夹的id一致来决定
if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) {
// 如果数据的ID为通话记录文件夹
// 隐藏通话名称视图,显示提醒视图
mCallName.setVisibility(View.GONE);
mAlert.setVisibility(View.VISIBLE);
mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem);// 设置标题文本外观样式
mTitle.setText(context.getString(R.string.call_record_folder_name)
+ context.getString(R.string.format_folder_files_count, data.getNotesCount()));// 设置标题文本内容为通话记录文件夹名称和文件数量
mAlert.setImageResource(R.drawable.call_record);// 设置提醒图标为通话记录图标
// 如果数据的父ID为通话记录文件夹
} else if (data.getParentId() == Notes.ID_CALL_RECORD_FOLDER) {
mCallName.setVisibility(View.VISIBLE);
mCallName.setText(data.getCallName());
mTitle.setTextAppearance(context,R.style.TextAppearanceSecondaryItem);
// 显示通话名称视图,并设置通话名称文本
mCallName.setVisibility(View.VISIBLE);
mCallName.setText(data.getCallName());
mTitle.setTextAppearance(context, R.style.TextAppearanceSecondaryItem); // 设置标题文本外观样式
mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet()));// 设置标题文本内容为格式化后的片段
// 如果数据有提醒,则显示提醒图标,否则隐藏
if (data.hasAlert()) {
mAlert.setImageResource(R.drawable.clock);
mAlert.setVisibility(View.VISIBLE);
} else {
mAlert.setVisibility(View.GONE);
}
} else {
// 其他情况
mCallName.setVisibility(View.GONE);// 隐藏通话名称视图
mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem);// 设置标题文本外观样式
if (data.getType() == Notes.TYPE_FOLDER) {
mTitle.setText(data.getSnippet()
+ context.getString(R.string.format_folder_files_count,
data.getNotesCount()));// 如果数据类型为文件夹,则设置标题文本内容为文件夹片段和文件数量
mAlert.setVisibility(View.GONE);// 隐藏提醒图标
} else {
// 如果数据类型不为文件夹,则设置标题文本内容为格式化后的片段
mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet()));
// 如果数据有提醒,则显示提醒图标,否则隐藏
if (data.hasAlert()) {
mAlert.setImageResource(R.drawable.clock);//图片来源的设置
mAlert.setImageResource(R.drawable.clock);
mAlert.setVisibility(View.VISIBLE);
} else {
mAlert.setVisibility(View.GONE);
}
} else {
mCallName.setVisibility(View.GONE);
mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem);
if (data.getType() == Notes.TYPE_FOLDER) {
mTitle.setText(data.getSnippet()
+ context.getString(R.string.format_folder_files_count,
data.getNotesCount()));
mAlert.setVisibility(View.GONE);
} else {
mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet()));
if (data.hasAlert()) {
mAlert.setImageResource(R.drawable.clock);
mAlert.setVisibility(View.VISIBLE);
} else {
mAlert.setVisibility(View.GONE);
}
}
}
mTime. setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate()));//获取相关时间从data里编辑的日期中获取
setBackground(data);
}
mTime.setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate()));// 设置时间文本为相对时间跨度字符串,从数据的修改日期中获取
setBackground(data);// 设置背景
}
//根据data的文件属性来设置背景

@ -240,72 +240,68 @@ public class NotesPreferenceActivity extends PreferenceActivity {
*
*/
private void showSelectAccountAlertDialog() {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); //创建一个新的对话框
//设置标题以及子标题的内容
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); // 创建一个新的对话框
// 设置标题以及子标题的内容
View titleView = LayoutInflater.from(this).inflate(R.layout.account_dialog_title, null);
TextView titleTextView = (TextView) titleView.findViewById(R.id.account_dialog_title);
titleTextView.setText(getString(R.string.preferences_dialog_select_account_title));
titleTextView.setText(getString(R.string.preferences_dialog_select_account_title)); // 设置标题文本
TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle);
subtitleTextView.setText(getString(R.string.preferences_dialog_select_account_tips));
dialogBuilder.setCustomTitle(titleView);
dialogBuilder.setPositiveButton(null, null);
//获取同步账户信息
Account[] accounts = getGoogleAccounts();
String defAccount = getSyncAccountName(this);
mOriAccounts = accounts;
mHasAddedAccount = false;
subtitleTextView.setText(getString(R.string.preferences_dialog_select_account_tips)); // 设置子标题文本
dialogBuilder.setCustomTitle(titleView); // 设置自定义标题
dialogBuilder.setPositiveButton(null, null); // 设置积极按钮为空
// 获取同步账户信息
Account[] accounts = getGoogleAccounts(); // 获取Google账户信息
String defAccount = getSyncAccountName(this); // 获取默认同步账户名称
mOriAccounts = accounts; // 保存原始账户信息
mHasAddedAccount = false; // 将新加账户标志置为false
if (accounts.length > 0) {
CharSequence[] items = new CharSequence[accounts.length];
final CharSequence[] itemMapping = items;
int checkedItem = -1;
CharSequence[] items = new CharSequence[accounts.length]; // 创建一个CharSequence数组用于存储账户名称
final CharSequence[] itemMapping = items; // 创建一个最终的CharSequence数组用于映射
int checkedItem = -1; // 初始化选中的项为-1
int index = 0;
for (Account account : accounts) {
if (TextUtils.equals(account.name, defAccount)) {
checkedItem = index; //在账户列表中查询到所需账户
checkedItem = index; // 如果找到默认账户,设置选中的项为当前索引
}
items[index++] = account.name;
items[index++] = account.name; // 将账户名称添加到数组中
}
//设置点击后执行的事件,包括检录新同步账户和刷新标签界面
// 设置单选列表项,并为每一项设置点击事件
dialogBuilder.setSingleChoiceItems(items, checkedItem,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
setSyncAccount(itemMapping[which].toString());
dialog.dismiss();//取消对话框
refreshUI();
setSyncAccount(itemMapping[which].toString()); // 设置选择的同步账户
dialog.dismiss(); // 关闭对话框
refreshUI(); // 刷新界面
}
});
}
View addAccountView = LayoutInflater.from(this).inflate(R.layout.add_account_text, null);
dialogBuilder.setView(addAccountView);//给新加账户对话框设置自定义样式
final AlertDialog dialog = dialogBuilder.show();//显示对话框
//建立新加账户对话框的监听器
View addAccountView = LayoutInflater.from(this).inflate(R.layout.add_account_text, null); // 加载自定义的添加账户视图
dialogBuilder.setView(addAccountView); // 设置对话框的视图为添加账户视图
final AlertDialog dialog = dialogBuilder.show(); // 显示对话框
// 设置添加账户视图的点击事件监听器
addAccountView.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
mHasAddedAccount = true;//将新加账户的hash置true
Intent intent = new Intent("android.settings.ADD_ACCOUNT_SETTINGS");//建立网络建立组件
mHasAddedAccount = true; // 将新加账户的标志置为true
Intent intent = new Intent("android.settings.ADD_ACCOUNT_SETTINGS"); // 创建一个添加账户的意图
intent.putExtra(AUTHORITIES_FILTER_KEY, new String[] {
"gmail-ls"
});
startActivityForResult(intent, -1);//跳回上一个选项
dialog.dismiss();//关闭一个Dialog对话框
startActivityForResult(intent, -1); // 启动添加账户的界面,并等待结果返回
dialog.dismiss(); // 关闭对话框
}
});
}
/*
@ -386,10 +382,10 @@ public class NotesPreferenceActivity extends PreferenceActivity {
//重置当地同步任务的信息
new Thread(new Runnable() {
public void run() {
ContentValues values = new ContentValues();
values.put(NoteColumns.GTASK_ID, "");
ContentValues values = new ContentValues();// 创建ContentValues对象用于存储要更新的列值
values.put(NoteColumns.GTASK_ID, "");// 将GTASK_ID列的值设置为空字符串
values.put(NoteColumns.SYNC_ID, 0);
getContentResolver().update(Notes.CONTENT_NOTE_URI, values, null, null);
getContentResolver().update(Notes.CONTENT_NOTE_URI, values, null, null);// 调用getContentResolver().update方法更新数据库中的数据
}
}).start();
@ -493,8 +489,8 @@ public class NotesPreferenceActivity extends PreferenceActivity {
//在主页情况下在创建连接组件intent发出清空的信号并开始一个相应的activity
case android.R.id.home:
Intent intent = new Intent(this, NotesListActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);// 添加FLAG_ACTIVITY_CLEAR_TOP标志清除位于该Activity上方的所有Activity实例
startActivity(intent);// 启动NotesListActivity
return true;
default:

Loading…
Cancel
Save