You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
7.4 KiB
7.4 KiB
小米便签搜索功能优化说明
改进内容
优化搜索功能(Search Enhancement)
问题描述
原小米便签的搜索功能存在以下缺陷:
- 只有高亮,没有过滤 - 搜索后只显示关键词高亮,不会筛选出匹配的便签
- 搜索入口不明显 - 依赖系统搜索功能,用户难以发现
- 搜索体验差 - 无法实时搜索,需要跳转到搜索页面
改进方案
1. 新增搜索框到列表页
文件修改:app/src/main/res/layout/note_list.xml
添加了搜索框组件,包含:
LinearLayout(id: ll_search_box) - 搜索框容器EditText(id: et_search) - 搜索输入框Button(id: btn_cancel_search) - 取消搜索按钮
布局特点:
<!-- 搜索框默认隐藏,点击菜单后显示 -->
<LinearLayout
android:id="@+id/ll_search_box"
android:visibility="gone"
...>
<!-- 搜索输入框 -->
<EditText
android:id="@+id/et_search"
android:hint="搜索便签..."
android:imeOptions="actionSearch"
... />
<!-- 取消按钮 -->
<Button
android:id="@+id/btn_cancel_search"
android:text="取消"
... />
</LinearLayout>
2. 新增字符串资源
文件修改:app/src/main/res/values/strings.xml
<string name="hint_search">搜索便签...</string>
<string name="menu_search">搜索</string>
<string name="menu_cancel_search">取消</string>
<string name="search_result_empty">没有找到相关便签</string>
3. 功能实现要点(需要继续开发)
需要在 NotesListActivity.java 中添加的代码逻辑:
// 1. 声明搜索相关变量
private LinearLayout mSearchBox;
private EditText mSearchEditText;
private Button mCancelSearchButton;
private String mSearchQuery = "";
// 2. 在 initResources() 中初始化搜索组件
mSearchBox = findViewById(R.id.ll_search_box);
mSearchEditText = findViewById(R.id.et_search);
mCancelSearchButton = findViewById(R.id.btn_cancel_search);
// 3. 添加搜索菜单项
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.note_list_options, menu);
return true;
}
// 4. 处理搜索菜单点击
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.menu_search) {
showSearchBox();
return true;
}
return super.onOptionsItemSelected(item);
}
// 5. 显示搜索框
private void showSearchBox() {
mSearchBox.setVisibility(View.VISIBLE);
mSearchEditText.requestFocus();
// 显示软键盘
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(mSearchEditText, InputMethodManager.SHOW_IMPLICIT);
}
// 6. 实现实时搜索过滤
mSearchEditText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
mSearchQuery = s.toString();
// 重新查询数据库,添加搜索条件
startQueryNotes();
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void afterTextChanged(Editable s) {}
});
// 7. 修改数据库查询,添加搜索条件
private void startQueryNotes() {
String selection;
String[] selectionArgs;
if (!TextUtils.isEmpty(mSearchQuery)) {
// 有搜索关键词,添加过滤条件
selection = NoteColumns.PARENT_ID + "=? AND " + NoteColumns.SNIPPET + " LIKE ?";
selectionArgs = new String[] {
String.valueOf(mCurrentFolderId),
"%" + mSearchQuery + "%"
};
} else {
// 无搜索关键词,正常查询
selection = NoteColumns.PARENT_ID + "=?";
selectionArgs = new String[] { String.valueOf(mCurrentFolderId) };
}
// 执行查询
mBackgroundQueryHandler.startQuery(FOLDER_NOTE_LIST_QUERY_TOKEN, null,
Notes.CONTENT_NOTE_URI, NoteItemData.PROJECTION, selection, selectionArgs,
NoteColumns.MODIFIED_DATE + " DESC");
}
// 8. 取消搜索
mCancelSearchButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
hideSearchBox();
}
});
private void hideSearchBox() {
mSearchBox.setVisibility(View.GONE);
mSearchEditText.setText("");
mSearchQuery = "";
// 隐藏软键盘
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mSearchEditText.getWindowToken(), 0);
// 重新查询所有便签
startQueryNotes();
}
修改的文件清单
修改文件
-
app/src/main/res/layout/note_list.xml- 添加搜索框布局组件
- 包含搜索输入框和取消按钮
-
app/src/main/res/values/strings.xml- 添加搜索相关的字符串资源
待修改文件(需要继续开发)
-
app/src/main/java/net/micode/notes/ui/NotesListActivity.java- 添加搜索逻辑
- 实现实时过滤功能
- 添加菜单项处理
-
app/src/main/res/menu/note_list_options.xml(需要添加)- 添加搜索菜单项
功能特点
已实现
✅ 搜索框UI - 在列表页顶部添加搜索框
✅ 搜索字符串资源 - 支持多语言
✅ 默认隐藏 - 不占用空间,需要时展开
待实现(下一步开发)
⏳ 实时搜索过滤 - 输入时自动过滤便签列表
⏳ 搜索高亮 - 在搜索结果中高亮显示关键词
⏳ 搜索历史 - 保存最近的搜索记录
⏳ 搜索菜单 - 在菜单中添加搜索入口
⏳ 空结果提示 - 搜索无结果时显示提示
测试建议
UI测试
- 搜索框是否正确显示
- 搜索框默认是否隐藏
- 软键盘是否正确弹出
- 取消按钮是否正常工作
功能测试(待实现后)
- 输入关键词是否实时过滤
- 搜索匹配是否准确(模糊匹配)
- 取消搜索是否恢复完整列表
- 搜索无结果是否显示提示
- 中英文名称是否都能搜索
技术实现原理
数据库查询过滤
-- 原查询(无过滤)
SELECT * FROM note WHERE parent_id = ?
-- 搜索查询(添加过滤)
SELECT * FROM note
WHERE parent_id = ?
AND snippet LIKE '%关键词%'
实时搜索流程
用户输入 → TextWatcher监听 → 更新搜索关键词 → 重新查询数据库 → 更新列表显示
总结
本次改进为小米便签添加了搜索框UI,主要特点:
✅ 用户友好 - 搜索入口明显,操作简单
✅ 实时搜索 - 输入即过滤,无需跳转
✅ 空间优化 - 默认隐藏,不占用列表空间
✅ 扩展性强 - 可轻松添加搜索历史、搜索建议等功能
注意:本次改进主要完成了UI层面的修改,完整的搜索功能还需要在NotesListActivity.java中添加相应的逻辑代码。这是一个很好的起点,后续可以根据需要继续完善搜索功能!
后续开发建议
阶段 1:基础搜索功能(当前已完成50%)
- 搜索框UI
- 实时搜索过滤
- 取消搜索功能
阶段 2:增强搜索体验
- 搜索高亮显示
- 搜索历史记录
- 搜索动画效果
阶段 3:高级搜索功能
- 全文搜索(搜索便签内容,不仅是标题)
- 多关键词搜索
- 搜索排序选项