Compare commits

...

1 Commits
master ... dev

Author SHA1 Message Date
郭佳豪 bc473aac61 v0.0
5 months ago

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

@ -1,8 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!-- AndroidManifest.xml 是 Android 应用的核心配置文件,定义了应用的基本信息、组件声明以及权限需求。-->
<!-- 定义应用所需的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--从 Android 13 开始WRITE_EXTERNAL_STORAGE 权限已被弃用
直接访问共享存储需要使用更安全的 API如 MediaStore以提升用户隐私保护。-->
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
@ -16,17 +20,17 @@
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:icon="@drawable/icon_app"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Notesmaster"
tools:targetApi="31">
<!-- 定义主活动,作为应用的入口点 -->
<activity
android:name=".ui.NotesListActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:label="@string/app_name"
android:launchMode="singleTop"
android:theme="@style/NoteTheme"
android:uiOptions="splitActionBarWhenNarrow"
@ -39,6 +43,7 @@
</intent-filter>
</activity>
<!-- 定义笔记编辑活动 -->
<activity
android:name=".ui.NoteEditActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
@ -70,12 +75,17 @@
android:resource="@xml/searchable" />
</activity>
<!-- 定义内容提供者 -->
<provider
android:name="net.micode.notes.data.NotesProvider"
android:authorities="micode_notes"
android:multiprocess="true" />
android:multiprocess="true"
android:exported="false"
android:readPermission="com.example.notesmaster.permission.READ_NOTES"
android:writePermission="com.example.notesmaster.permission.WRITE_NOTES" />
<!-- 定义小部件提供者 -->
<receiver
android:name=".widget.NoteWidgetProvider_2x"
android:label="@string/app_widget2x2"
@ -106,6 +116,7 @@
android:resource="@xml/widget_4x_info" />
</receiver>
<!-- 定义启动时初始化闹钟的接收器 -->
<receiver android:name=".ui.AlarmInitReceiver"
android:exported="true">
<intent-filter>
@ -113,18 +124,20 @@
</intent-filter>
</receiver>
<!-- 定义处理闹钟事件的接收器 -->
<receiver
android:name="net.micode.notes.ui.AlarmReceiver"
android:process=":remote" >
</receiver>
<!-- 定义闹钟提醒活动 -->
<activity
android:name=".ui.AlarmAlertActivity"
android:label="@string/app_name"
android:launchMode="singleInstance"
android:theme="@android:style/Theme.Holo.Wallpaper.NoTitleBar" >
</activity>
<!-- 定义设置活动 -->
<activity
android:name="net.micode.notes.ui.NotesPreferenceActivity"
android:label="@string/preferences_title"
@ -132,11 +145,13 @@
android:theme="@android:style/Theme.Holo.Light" >
</activity>
<!-- 定义Google任务同步服务 -->
<service
android:name="net.micode.notes.gtask.remote.GTaskSyncService"
android:exported="false" >
</service>
<!-- 定义默认搜索活动 -->
<meta-data
android:name="android.app.default_searchable"
android:value=".ui.NoteEditActivity" />
@ -149,7 +164,22 @@
<!-- <category android:name="android.intent.category.LAUNCHER" />-->
<!-- </intent-filter>-->
<!-- </activity>-->
<!-- </activity>
这段代码被注释化的原因可能有以下几种情况:
冗余配置:
如果应用已经有另一个活动(如 NotesListActivity作为主入口点并且已经正确配置了 <intent-filter>
那么再定义一个类似的 MainActivity 就是冗余的。为了避免冲突或重复配置,开发者选择将其注释掉。
开发阶段调整:
在开发过程中,开发者可能尝试过不同的入口点配置,最终选择了 NotesListActivity 作为主活动,
因此将 MainActivity 注释掉以保留历史代码供参考。
功能迁移:
如果应用的功能结构发生了变化,原本由 MainActivity 承担的功能现在由其他活动(如 NotesListActivity接管
那么 MainActivity 就不再需要作为主入口点。
测试或调试:
有时开发者会临时注释掉某些代码以进行测试或调试,之后忘记取消注释。-->
</application>

@ -430,7 +430,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
if (id == R.id.btn_set_bg_color) {
mNoteBgColorSelector.setVisibility(View.VISIBLE);
findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(
- View.VISIBLE);
View.VISIBLE);
} else if (sBgSelectorBtnsMap.containsKey(id)) {
findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(
View.GONE);

@ -82,136 +82,232 @@ public class NoteEditText extends EditText {
mIndex = 0;
}
/**
*
*
*
* @param index
*/
public void setIndex(int index) {
mIndex = index;
}
/**
*
*
*
* @param listener OnTextViewChangeListener
*/
public void setOnTextViewChangeListener(OnTextViewChangeListener listener) {
mOnTextViewChangeListener = listener;
}
/**
* XML NoteEditText
*
* @param context
* @param attrs XML
*/
public NoteEditText(Context context, AttributeSet attrs) {
super(context, attrs, android.R.attr.editTextStyle);
}
/**
* XML NoteEditText
*
* @param context
* @param attrs XML
* @param defStyle ID
*/
public NoteEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
/**
*
*
*
*
* @param event
* @return truefalse
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
// 根据触摸事件的类型进行不同的处理
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// 获取触摸点相对于视图的坐标
int x = (int) event.getX();
int y = (int) event.getY();
// 调整坐标以考虑视图的内边距
x -= getTotalPaddingLeft();
y -= getTotalPaddingTop();
// 调整坐标以考虑视图的滚动偏移
x += getScrollX();
y += getScrollY();
// 获取视图中的文本布局
Layout layout = getLayout();
// 根据垂直位置计算触摸点所在的文本行
int line = layout.getLineForVertical(y);
// 根据水平位置计算触摸点所在的文本偏移量
int off = layout.getOffsetForHorizontal(line, x);
// 更新文本选择
Selection.setSelection(getText(), off);
break;
}
// 调用父类的onTouchEvent方法以处理其他触摸事件
return super.onTouchEvent(event);
}
/**
* onKeyDown
*
* @param keyCode
* @param event
* @return truefalse
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// 根据不同的键码做相应的处理
switch (keyCode) {
case KeyEvent.KEYCODE_ENTER:
// 当检测到ENTER键时如果mOnTextViewChangeListener不为空则不处理事件交由其他处理程序处理
if (mOnTextViewChangeListener != null) {
return false;
}
break;
case KeyEvent.KEYCODE_DEL:
// 当检测到DEL键时记录删除操作前的光标位置
mSelectionStartBeforeDelete = getSelectionStart();
break;
default:
// 对于其他键码,不做特殊处理
break;
}
// 对于未特殊处理的键码,调用父类的方法处理
return super.onKeyDown(keyCode, event);
}
/**
*
*
* @param keyCode
* @param event
* @return truefalse
*/
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
// 根据按键代码处理不同的按键事件
switch(keyCode) {
case KeyEvent.KEYCODE_DEL:
// 处理删除键释放事件
if (mOnTextViewChangeListener != null) {
// 如果删除前光标位置为0且不是第一个文本框则通知监听器进行删除操作
if (0 == mSelectionStartBeforeDelete && mIndex != 0) {
mOnTextViewChangeListener.onEditTextDelete(mIndex, getText().toString());
return true;
}
} else {
// 如果监听器未设置,则记录日志
Log.d(TAG, "OnTextViewChangeListener was not seted");
}
break;
case KeyEvent.KEYCODE_ENTER:
// 处理回车键释放事件
if (mOnTextViewChangeListener != null) {
// 获取当前光标位置并分离出光标后的文本,然后设置文本框内容为光标前的文本
int selectionStart = getSelectionStart();
String text = getText().subSequence(selectionStart, length()).toString();
setText(getText().subSequence(0, selectionStart));
// 通知监听器进行回车操作处理
mOnTextViewChangeListener.onEditTextEnter(mIndex + 1, text);
} else {
// 如果监听器未设置,则记录日志
Log.d(TAG, "OnTextViewChangeListener was not seted");
}
break;
default:
// 对于其他按键事件,不做任何处理
break;
}
// 如果上述条件都不满足则调用父类的onKeyUp方法处理事件
return super.onKeyUp(keyCode, event);
}
/**
*
*
* @param focused
* @param direction
* @param previouslyFocusedRect
*/
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
// 如果有注册的文本视图变更监听器
if (mOnTextViewChangeListener != null) {
// 如果视图失去焦点且文本为空则调用监听器的onTextChange方法参数为false
if (!focused && TextUtils.isEmpty(getText())) {
mOnTextViewChangeListener.onTextChange(mIndex, false);
} else {
// 否则调用监听器的onTextChange方法参数为true
mOnTextViewChangeListener.onTextChange(mIndex, true);
}
}
// 调用父类的onFocusChanged方法确保焦点改变的默认行为得以执行
super.onFocusChanged(focused, direction, previouslyFocusedRect);
}
/**
*
* URL
* URL
*/
@Override
protected void onCreateContextMenu(ContextMenu menu) {
// 检查当前文本是否为Spanned类型以支持富文本
if (getText() instanceof Spanned) {
// 获取选中文本的起始和结束位置
int selStart = getSelectionStart();
int selEnd = getSelectionEnd();
// 确定选中文本的最小和最大位置,以处理选中区域
int min = Math.min(selStart, selEnd);
int max = Math.max(selStart, selEnd);
// 获取选中文本范围内的所有URLSpan对象
final URLSpan[] urls = ((Spanned) getText()).getSpans(min, max, URLSpan.class);
// 如果选中的文本中仅有一个URL则进一步处理
if (urls.length == 1) {
int defaultResId = 0;
// 遍历预定义的schema-action资源映射查找匹配的URL schema
for(String schema: sSchemaActionResMap.keySet()) {
// 如果URL包含当前schema则获取对应的资源ID并停止遍历
if(urls[0].getURL().indexOf(schema) >= 0) {
defaultResId = sSchemaActionResMap.get(schema);
break;
}
}
// 如果没有找到匹配的schema则使用默认的“其他”资源
if (defaultResId == 0) {
defaultResId = R.string.note_link_other;
}
// 在上下文菜单中添加一个菜单项,并设置点击事件处理
menu.add(0, 0, 0, defaultResId).setOnMenuItemClickListener(
new OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
// goto a new intent
// 点击菜单项时触发URL的onClick事件通常会启动一个新的Activity
urls[0].onClick(NoteEditText.this);
return true;
}
});
}
}
// 调用父类方法,确保菜单被正确创建
super.onCreateContextMenu(menu);
}
}

@ -63,7 +63,6 @@
</style>
<style name="NoteActionBarStyle" parent="@android:style/Widget.Holo.Light.ActionBar.Solid">
<item name="android:displayOptions" />
<item name="android:visibility">gone</item>
<item name="android:visibility">visible</item>
</style>
</resources>

@ -0,0 +1,6 @@
[.ShellClassInfo]
IconResource=D:\edge下载\Folder11-Ico-main\Folder11-Ico-main\ico\xiaomi.ico,0
[ViewState]
Mode=
Vid=
FolderType=Generic

Binary file not shown.
Loading…
Cancel
Save