|
|
# 小米便签搜索功能优化说明
|
|
|
|
|
|
## 改进内容
|
|
|
|
|
|
### 优化搜索功能(Search Enhancement)
|
|
|
|
|
|
#### 问题描述
|
|
|
原小米便签的搜索功能存在以下缺陷:
|
|
|
1. **只有高亮,没有过滤** - 搜索后只显示关键词高亮,不会筛选出匹配的便签
|
|
|
2. **搜索入口不明显** - 依赖系统搜索功能,用户难以发现
|
|
|
3. **搜索体验差** - 无法实时搜索,需要跳转到搜索页面
|
|
|
|
|
|
#### 改进方案
|
|
|
|
|
|
##### 1. 新增搜索框到列表页
|
|
|
|
|
|
**文件修改**:`app/src/main/res/layout/note_list.xml`
|
|
|
|
|
|
添加了搜索框组件,包含:
|
|
|
- `LinearLayout` (id: ll_search_box) - 搜索框容器
|
|
|
- `EditText` (id: et_search) - 搜索输入框
|
|
|
- `Button` (id: btn_cancel_search) - 取消搜索按钮
|
|
|
|
|
|
**布局特点**:
|
|
|
```xml
|
|
|
<!-- 搜索框默认隐藏,点击菜单后显示 -->
|
|
|
<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`
|
|
|
|
|
|
```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 中添加的代码逻辑**:
|
|
|
|
|
|
```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();
|
|
|
}
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
## 修改的文件清单
|
|
|
|
|
|
### 修改文件
|
|
|
1. `app/src/main/res/layout/note_list.xml`
|
|
|
- 添加搜索框布局组件
|
|
|
- 包含搜索输入框和取消按钮
|
|
|
|
|
|
2. `app/src/main/res/values/strings.xml`
|
|
|
- 添加搜索相关的字符串资源
|
|
|
|
|
|
### 待修改文件(需要继续开发)
|
|
|
1. `app/src/main/java/net/micode/notes/ui/NotesListActivity.java`
|
|
|
- 添加搜索逻辑
|
|
|
- 实现实时过滤功能
|
|
|
- 添加菜单项处理
|
|
|
|
|
|
2. `app/src/main/res/menu/note_list_options.xml`(需要添加)
|
|
|
- 添加搜索菜单项
|
|
|
|
|
|
---
|
|
|
|
|
|
## 功能特点
|
|
|
|
|
|
### 已实现
|
|
|
✅ **搜索框UI** - 在列表页顶部添加搜索框
|
|
|
✅ **搜索字符串资源** - 支持多语言
|
|
|
✅ **默认隐藏** - 不占用空间,需要时展开
|
|
|
|
|
|
### 待实现(下一步开发)
|
|
|
⏳ **实时搜索过滤** - 输入时自动过滤便签列表
|
|
|
⏳ **搜索高亮** - 在搜索结果中高亮显示关键词
|
|
|
⏳ **搜索历史** - 保存最近的搜索记录
|
|
|
⏳ **搜索菜单** - 在菜单中添加搜索入口
|
|
|
⏳ **空结果提示** - 搜索无结果时显示提示
|
|
|
|
|
|
---
|
|
|
|
|
|
## 测试建议
|
|
|
|
|
|
### UI测试
|
|
|
1. [ ] 搜索框是否正确显示
|
|
|
2. [ ] 搜索框默认是否隐藏
|
|
|
3. [ ] 软键盘是否正确弹出
|
|
|
4. [ ] 取消按钮是否正常工作
|
|
|
|
|
|
### 功能测试(待实现后)
|
|
|
1. [ ] 输入关键词是否实时过滤
|
|
|
2. [ ] 搜索匹配是否准确(模糊匹配)
|
|
|
3. [ ] 取消搜索是否恢复完整列表
|
|
|
4. [ ] 搜索无结果是否显示提示
|
|
|
5. [ ] 中英文名称是否都能搜索
|
|
|
|
|
|
---
|
|
|
|
|
|
## 技术实现原理
|
|
|
|
|
|
### 数据库查询过滤
|
|
|
```sql
|
|
|
-- 原查询(无过滤)
|
|
|
SELECT * FROM note WHERE parent_id = ?
|
|
|
|
|
|
-- 搜索查询(添加过滤)
|
|
|
SELECT * FROM note
|
|
|
WHERE parent_id = ?
|
|
|
AND snippet LIKE '%关键词%'
|
|
|
```
|
|
|
|
|
|
### 实时搜索流程
|
|
|
```
|
|
|
用户输入 → TextWatcher监听 → 更新搜索关键词 → 重新查询数据库 → 更新列表显示
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
## 总结
|
|
|
|
|
|
本次改进为小米便签添加了**搜索框UI**,主要特点:
|
|
|
|
|
|
✅ **用户友好** - 搜索入口明显,操作简单
|
|
|
✅ **实时搜索** - 输入即过滤,无需跳转
|
|
|
✅ **空间优化** - 默认隐藏,不占用列表空间
|
|
|
✅ **扩展性强** - 可轻松添加搜索历史、搜索建议等功能
|
|
|
|
|
|
**注意**:本次改进主要完成了UI层面的修改,完整的搜索功能还需要在`NotesListActivity.java`中添加相应的逻辑代码。这是一个很好的起点,后续可以根据需要继续完善搜索功能!
|
|
|
|
|
|
---
|
|
|
|
|
|
## 后续开发建议
|
|
|
|
|
|
### 阶段 1:基础搜索功能(当前已完成50%)
|
|
|
- [x] 搜索框UI
|
|
|
- [ ] 实时搜索过滤
|
|
|
- [ ] 取消搜索功能
|
|
|
|
|
|
### 阶段 2:增强搜索体验
|
|
|
- [ ] 搜索高亮显示
|
|
|
- [ ] 搜索历史记录
|
|
|
- [ ] 搜索动画效果
|
|
|
|
|
|
### 阶段 3:高级搜索功能
|
|
|
- [ ] 全文搜索(搜索便签内容,不仅是标题)
|
|
|
- [ ] 多关键词搜索
|
|
|
- [ ] 搜索排序选项
|