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.
touge/Notes-Master/SEARCH_FEATURE_IMPROVEMENT.md

7.4 KiB

小米便签搜索功能优化说明

改进内容

优化搜索功能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) - 取消搜索按钮

布局特点

<!-- 搜索框默认隐藏,点击菜单后显示 -->
<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();
}

修改的文件清单

修改文件

  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. 中英文名称是否都能搜索

技术实现原理

数据库查询过滤

-- 原查询(无过滤)
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高级搜索功能

  • 全文搜索(搜索便签内容,不仅是标题)
  • 多关键词搜索
  • 搜索排序选项