1

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

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 });
  }

}

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

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

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

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

谢谢。

4

2 回答 2

3

在对文档进行了一番头撞和跋涉之后。我懂了!

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

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

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 });
  }

}
于 2012-09-07T11:09:16.243 回答
1

我见过的大多数模式都会从 onCreate 和 onNewIntent() 回调中调用一个名为 handleIntent() 的函数。从那里或在 onNewIntent() 中,通过执行以下操作提取查询字符串:

字符串查询 = intent.getStringExtra(SearchManager.QUERY);

意图上。我不确定您的内容提供商是否可以改进,因为我现在正在追寻同一个目标。

于 2012-08-29T16:13:07.563 回答