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からhandleIntent()と呼ばれる関数を呼び出し、onNewIntent()がコールバックします。そこから、またはonNewIntent()内で、次のようにしてクエリ文字列が抽出されます。

文字列クエリ=intent.getStringExtra(SearchManager.QUERY);

意図的に。私は今同じターゲットを追いかけているので、あなたのコンテンツプロバイダーを改善できるかどうかはわかりません。

于 2012-08-29T16:13:07.563 に答える