java - 使用自定义搜索建议提供程序时获取搜索查询字符串

标签 java android android-searchmanager

我有一个自定义搜索建议提供程序。现在,这并不是真正提供建议本身,而是提供搜索快捷方式。这是我编写的自定义提供程序:

public class QuickSearchProvider extends SearchRecentSuggestionsProvider {

  public final static String AUTHORITY = "com.example.testapp.providers.QuickSearchProvider";
  public final static int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES;

  public QuickSearchProvider() {
    setupSuggestions(AUTHORITY, MODE);
  }

  public Cursor query(Uri uri, String[] projection, String sel,
      String[] selArgs, String sortOrder) {

      MatrixCursor cursor = new MatrixCursor(new String[] { 
          BaseColumns._ID,
          SearchManager.SUGGEST_COLUMN_TEXT_1,
          SearchManager.SUGGEST_COLUMN_TEXT_2,
          SearchManager.SUGGEST_COLUMN_ICON_1,
          SearchManager.SUGGEST_COLUMN_INTENT_ACTION});

      cursor.addRow(new Object[] { 0, "Plants", "Search Plants", android.R.drawable.ic_menu_search, Search.SEARCH_PLANTS_ACTION});
      cursor.addRow(new Object[] { 1, "Birds", "Search Birds", android.R.drawable.ic_menu_search, Search.SEARCH_BIRDS_ACTION });

      return new MergeCursor(new Cursor[] { cursor });
  }

}

在包含搜索字段的 Activity 中,我在 onNewIntent 方法中编写了一个处理程序。这是一个例子:

protected void onNewIntent(Intent intent) {
    if  (Search.SEARCH_PLANTS_ACTION.equals(intent.getAction())) {
        ...
    } else if (Search.SEARCH_BIRDS_ACTION.equals(intent.getAction())) {
        ...         
    }
}

如您所见,我可以轻松检查选择了哪个搜索快捷方式,但我似乎无法弄清楚如何获取原始查询字符串。有帮助吗?

(附带说明:如果您发现我对自定义搜索建议提供程序的实现有误或可以改进,请告诉我。)

谢谢。

最佳答案

经过一些头脑 Storm 和艰难地阅读文档之后。我知道了!

搜索字符串始终作为 query() 方法的 selArgs 参数中的第一项也是唯一一项可用。

为了在 Activity 的 Intent 处理程序中获取搜索字符串,您需要使用:intent.getStringExtra(SearchManager.QUERY)。默认情况下,此值仅在提交搜索时可用,而不是在单击搜索建议时可用。如果您需要使用您为搜索建议定义的自定义 Intent 获取此值,则需要像这样将其添加到光标:

public class QuickSearchProvider extends SearchRecentSuggestionsProvider {

  public final static String AUTHORITY = "com.example.testapp.providers.QuickSearchProvider";
  public final static int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES;

  public QuickSearchProvider() {
    setupSuggestions(AUTHORITY, MODE);
  }

  public Cursor query(Uri uri, String[] projection, String sel,
      String[] selArgs, String sortOrder) {

      MatrixCursor cursor = new MatrixCursor(new String[] { 
          BaseColumns._ID,
          SearchManager.SUGGEST_COLUMN_TEXT_1,
          SearchManager.SUGGEST_COLUMN_TEXT_2,
          SearchManager.SUGGEST_COLUMN_ICON_1,
          SearchManager.SUGGEST_COLUMN_QUERY,
          SearchManager.SUGGEST_COLUMN_INTENT_ACTION});

      cursor.addRow(new Object[] { 0, "Plants", "Search Plants", android.R.drawable.ic_menu_search, selArgs[0], Search.SEARCH_PLANTS_ACTION});
      cursor.addRow(new Object[] { 1, "Birds", "Search Birds", android.R.drawable.ic_menu_search, selArgs[0], Search.SEARCH_BIRDS_ACTION });

      return new MergeCursor(new Cursor[] { cursor });
  }

}

关于java - 使用自定义搜索建议提供程序时获取搜索查询字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12176720/

相关文章:

android - 在 Android 中使用 SearchView 进行搜索后,ListView 未更新

Android 搜索 onCancel() 监听器未被调用

java - 谷歌地图 : Save markers in an array and then list them

android - 用于开发应用程序的错误报告工具/库

android - 如何在构建 Android 应用程序的发布版本之前删除所有调试日志记录调用?

android - 如何像新的 GMail 应用程序一样在 ActionBar 中创建双行文本

java - 浸入像素转换结果完全相同

java - 如何在java中创建内部类对象的多维数组

java - Apache Tomcat 7 不接受连接

android - 操作栏上的搜索小部件不会触发我的搜索 Activity