「新規顧客の獲得」目標を
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>
検索アイコンを利用しやすくするには、
/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 }
アプリを実行すると、次のような結果が出力されます。
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
と
ユーザーがクエリを送信すると、SearchView
が
ACTION_SEARCH
使用します。次に、このインテントをフィルタするアクティビティが必要になります。
できます。
検索可能なアクティビティを作成する
ACTION_SEARCH
インテントの検索可能なアクティビティ フィルタ。
データセット内でクエリを検索します検索可能アクティビティを作成するには、
ACTION_SEARCH
でフィルタする任意のアクティビティ
インテント:
<activity android:name=".SearchResultsActivity" ... > ... <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> ... </activity>
検索可能なアクティビティで、ACTION_SEARCH
インテントを次のように処理します。
確認しています。
onCreate()
メソッドを呼び出します。
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
: データの他のレイヤで使用できます。
表示する検索結果を取得するためのアーキテクチャです。