カスタムの検索候補を追加する

Android の検索ダイアログでは、最近の検索クエリに基づいて検索候補を表示できます。 検索ウィジェットです。たとえばユーザーが「子犬」と検索するとクエリが候補として表示されるのは、 同じクエリをもう一度入力します。図 1 は、最近のクエリを含む検索ダイアログの例 提案します。

始める前に、基本的な検索用に検索ダイアログまたは検索ウィジェットを実装します。 使用できます。方法については、以下をご覧ください。 検索インターフェースを作成します

基本情報

図 1. 最近のクエリを含む検索ダイアログのスクリーンショット 提案します。

最近のクエリの候補は、保存済み検索条件です。ユーザーが候補を選択すると、検索可能な アクティビティが ACTION_SEARCH インテント 検索可能なアクティビティがすでに処理している検索クエリとして候補が表示されます。

最近のクエリに基づく候補を表示するには、以下の操作を行う必要があります。

  • 検索可能アクティビティを実装する。
  • コンテンツ プロバイダを拡張して SearchRecentSuggestionsProvider アプリ マニフェストで宣言します。
  • 次のコンテンツ プロバイダに関する情報を使用して、検索可能構成を変更する 検索候補。
  • 検索が実行されるたびにコンテンツ プロバイダにクエリを保存します。

Android システムが検索ダイアログを表示するのと同様に、下に検索候補を表示します。 閉じることもできます。システムが提案を取得するソースを指定します。

アクティビティが検索可能であるとシステムが判断し、検索候補を表示すると、 ユーザーがクエリを入力すると、次の処理が行われます。

  1. システムは、ユーザーが入力を開始するたびに検索クエリテキストを取得し、 は、候補が含まれるコンテンツ プロバイダに対してクエリを実行します。
  2. コンテンツ プロバイダが すべてを指す Cursor 検索候補が表示されます。
  3. システムは、Cursor が提供する候補のリストを表示します。

最近のクエリに基づく候補が表示された後、以下の処理が行われることがあります。

  • ユーザーが別のキーを入力したり、なんらかの方法でクエリを変更したりした場合は、前のステップが繰り返されます。 候補リストが更新されます
  • ユーザーが検索を実行すると、候補は無視され、検索が次の宛先に配信されます。 検索可能なアクティビティを、通常の ACTION_SEARCH インテントで呼び出します。
  • ユーザーが候補を選択すると、ACTION_SEARCH インテントが配信されます。 テキストの候補をクエリとして使用して検索可能アクティビティを作成できます。

コンテンツ プロバイダ用に拡張する SearchRecentSuggestionsProvider クラス これまでのステップで作業が自動的に行われるため、作成するコードはほとんどありません。

コンテンツ プロバイダを作成する

最近のクエリの候補を表示するために必要なコンテンツ プロバイダは、 SearchRecentSuggestionsProvider。このクラスはすべてを行います。必要なのは、 1 行のコードを実行するクラス コンストラクタを記述します。

最近のクエリに対するコンテンツ プロバイダの完全な実装の例を以下に示します。 候補:

Kotlin

class MySuggestionProvider : SearchRecentSuggestionsProvider() {
    init {
        setupSuggestions(AUTHORITY, MODE)
    }

    companion object {
        const val AUTHORITY = "com.example.MySuggestionProvider"
        const val MODE: Int = SearchRecentSuggestionsProvider.DATABASE_MODE_QUERIES
    }
}

Java

public class MySuggestionProvider extends SearchRecentSuggestionsProvider {
    public final static String AUTHORITY = "com.example.MySuggestionProvider";
    public final static int MODE = DATABASE_MODE_QUERIES;

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

この呼び出しは、 setupSuggestions() 検索権限の名前とデータベース モードを渡します。検索権限には、任意の一意の ID を指定できます。 コンテンツ プロバイダの完全修飾名( パッケージ名の後にプロバイダのクラス名を続けます。例: "com.example.MySuggestionProvider"

データベース モードには、 DATABASE_MODE_QUERIES 必要に応じて DATABASE_MODE_2LINES, 提案テーブルに列が追加され、各行に 2 行目のテキストを提供できるようになりました。 表示されます。各候補に 2 行を指定する場合は、次の例をご覧ください。

Kotlin

const val MODE: Int = DATABASE_MODE_QUERIES or DATABASE_MODE_2LINES

Java

public final static int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES;

アプリ マニフェストで、コンテンツ プロバイダをアプリ マニフェストで宣言する際、 SearchRecentSuggestionsProvider クラスと検索可能構成。次に例を示します。

<application>
    <provider android:name=".MySuggestionProvider"
              android:authorities="com.example.MySuggestionProvider" />
    ...
</application>

検索可能構成を変更する

候補のプロバイダを使用するようにシステムを設定するには、 android:searchSuggestAuthority および android:searchSuggestSelection 検索可能構成ファイルの <searchable> 要素に属性を追加します。次に例を示します。

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_label"
    android:hint="@string/search_hint"
    android:searchSuggestAuthority="com.example.MySuggestionProvider"
    android:searchSuggestSelection=" ?" >
</searchable>

android:searchSuggestAuthority の値は、 コンテンツ プロバイダで使用されている権限と完全に一致するコンテンツ プロバイダ 上記の例では "com.example.MySuggestionProvider" が使用されます。

android:searchSuggestSelection の値は、先頭に 1 つの疑問符を付ける必要があります スペース「" ?"」による投稿。これは SQLite の選択引数のプレースホルダであり、 ユーザーが入力したクエリテキストに自動的に置換されます。

クエリを保存する

最近のクエリのコレクションを追加するには、検索可能な アクティビティを SearchRecentSuggestionsProvider に追加します。そのためには、インスタンスを作成して SearchRecentSuggestions 呼び出し saveRecentQuery() 検索可能アクティビティがクエリを受け取るたびに記録されます。たとえば、次のような方法でクエリを保存できます。 アクティビティ中に onCreate() メソッド:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main)

    if (Intent.ACTION_SEARCH == intent.action) {
        intent.getStringExtra(SearchManager.QUERY)?.also { query ->
            SearchRecentSuggestions(this, MySuggestionProvider.AUTHORITY, MySuggestionProvider.MODE)
                    .saveRecentQuery(query, null)
        }
    }
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Intent intent  = getIntent();

    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        String query = intent.getStringExtra(SearchManager.QUERY);
        SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
                MySuggestionProvider.AUTHORITY, MySuggestionProvider.MODE);
        suggestions.saveRecentQuery(query, null);
    }
}

SearchRecentSuggestionsProvider コンストラクタには、 コンテンツ プロバイダが宣言した権限とデータベース モードと同じである必要があります。

saveRecentQuery() メソッドは、最初のパラメータとして検索クエリ文字列を受け取ります。 およびオプションで、提案の 2 行目として含める 2 つ目の文字列または null。2 つ目の パラメータは、 DATABASE_MODE_2LINES。2 行モードを有効にすると、クエリテキストは 一致する候補をシステムが検索するときの 2 行目です。

候補のデータを削除する

ユーザーのプライバシーを保護するため、最近のクエリを削除する方法を常にユーザーに提供してください 提案します。クエリの履歴を消去するには、 clearHistory()。 例:

Kotlin

SearchRecentSuggestions(this, HelloSuggestionsProvider.AUTHORITY, HelloSuggestionsProvider.MODE)
        .clearHistory()

Java

SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
        HelloSuggestionProvider.AUTHORITY, HelloSuggestionProvider.MODE);
suggestions.clearHistory();

選択した [検索履歴を削除] から実行するメニュー項目、設定項目、ボタンです。 ユーザーが検索履歴の削除を希望していることを確認する確認ダイアログを表示する。