検索インターフェースを設定する

「新規顧客の獲得」目標を SearchView ウィジェットをアプリバーの項目として表示し、アプリ内で検索機能を提供します。として すべてのアイテムがアプリバーにあれば、SearchView を定義して 常に表示するか、スペースがある場合にのみ表示するかを選択できます。また、 SearchView をアイコンとして表示する折りたたみ可能なアクション 検索フィールドとしてアプリバー全体を使用しますが、 アイコンをタップします。

SearchView をアプリバーに追加する

SearchView ウィジェットをアプリバーに追加するには、 プロジェクト res/menu/options_menu.xml を作成し、次のコードを追加します。 追加します。このコードは、次のような検索アイテムの作成方法を定義します。 アイテムのタイトル。collapseActionView 属性 SearchView を拡張してアプリバー全体を占有し、 使用しないときは、通常のアプリバー項目に折りたたんでください。なぜなら、 ハンドセットのアプリバーのスペースが限られているため、 ユーザー エクスペリエンスを向上させるための collapsibleActionView 属性 体験できます

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/search"
        android:title="@string/search_title"
        android:icon="@drawable/ic_search"
        android:showAsAction="collapseActionView|ifRoom"
        android:actionViewClass="androidx.appcompat.widget.SearchView" />
</menu>
<ph type="x-smartling-placeholder">

検索アイコンを利用しやすくするには、 /res/drawable フォルダ内の ic_search.xml ファイルと 次のコードを含めます。

<vector
    android:height="24dp"
    android:tint="#000000"
    android:viewportHeight="24"
    android:viewportWidth="24"
    android:width="24dp"
    xmlns:android="http://schemas.android.com/apk/res/android">
        <path android:fillColor="@android:color/white" android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/>
</vector>

アプリバーに SearchView を表示するには、XML メニューをインフレートします。 リソース res/menu/options_menu.xml onCreateOptionsMenu() 次のように指定します。

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.options_menu, menu)

    return true
}

アプリを実行すると、次のような結果が出力されます。

アプリのトップバーに検索アイコンがある空の画面を示す画像
図 1. アプリのトップバーにある検索アイコン

SearchView がアプリのアプリバーに表示されるが、表示されない 説明します。検索アイコンをタップすると、次のように表示されます。

検索ビューの動作を示す画像
図 2. SearchView の動作

SearchView を機能させるには、 SearchView が動作することを確認します。

検索構成を作成する

検索 configuration: SearchView がどのように動作するかを指定します。 res/xml/searchable.xml ファイルで定義されています。検索構成 少なくとも、android:label 属性には android:label 属性と同じ値である <アプリケーション> または <activity> 要素を追加します。ただし、推奨する android:hint 属性を使用すると、入力する内容がユーザーにわかりやすくなります。 入力します。

<?xml version="1.0" encoding="utf-8"?>

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
        android:label="@string/app_name"
        android:hint="@string/search_hint" />

アプリのマニフェスト ファイルで、 <meta-data> res/xml/searchable.xml ファイルを指す要素です。 表示する <activity> の要素 SearchView

<activity
android:name=".SearchResultsActivity"
android:exported="false"
android:label="@string/title_activity_search_results"
android:launchMode="singleTop"
android:theme="@style/Theme.AppCompat.Light">
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    <meta-data
        android:name="android.app.searchable"
        android:resource="@xml/searchable" />
</activity>

作成した onCreateOptionsMenu() メソッドで、 SearchView を指定した検索構成を setSearchableInfo(SearchableInfo):

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.options_menu, menu)

    val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
    val searchView = menu.findItem(R.id.search).actionView as SearchView
    val component = ComponentName(this, SearchResultsActivity::class.java)
    val searchableInfo = searchManager.getSearchableInfo(component)
    searchView.setSearchableInfo(searchableInfo)
    return true
}

この呼び出しは、 getSearchableInfo() 取得される SearchableInfo 検索構成 XML ファイルから作成されたオブジェクトです。検索が 構成が SearchView と ユーザーがクエリを送信すると、SearchViewACTION_SEARCH 使用します。次に、このインテントをフィルタするアクティビティが必要になります。 できます。

検索可能なアクティビティを作成する

ACTION_SEARCH インテントの検索可能なアクティビティ フィルタ。 データセット内でクエリを検索します検索可能アクティビティを作成するには、 ACTION_SEARCH でフィルタする任意のアクティビティ インテント:

<activity android:name=".SearchResultsActivity" ... >
    ...
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    ...
</activity>

検索可能なアクティビティで、ACTION_SEARCH インテントを次のように処理します。 確認しています。 onCreate() メソッドを呼び出します。

<ph type="x-smartling-placeholder">

Kotlin

class SearchResultsActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_search_results)
        handleIntent(intent)
    }

    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        handleIntent(intent)
    }

    private fun handleIntent(intent: Intent) {
        if (Intent.ACTION_SEARCH == intent.action) {
            val query = intent.getStringExtra(SearchManager.QUERY)
            Log.d("SEARCH", "Search query was: $query")
        }
    }
}

これで、SearchView がユーザーのクエリを受け取り、 ACTION_SEARCH インテントで検索できます。

検索クエリを取得したら、それを ViewModel: データの他のレイヤで使用できます。 表示する検索結果を取得するためのアーキテクチャです。