【Android】ActionBarから検索して別Activityで結果を表示する
検索してもなぜか、同じActivityで受け取る例ばかり出てくるので、自分のメモ用に。
検索を行うActivityをDoSearchActivity、検索結果を受け取るActivityをSearchResultActivityとする。
AndroidManifest
検索を行う側(DoSearchActivity)にandroid.app.default_searchableという名前のmeta-dataを追加する。
そしてvalueに検索結果を受け取るActvityを指定する。
検索結果を表示するActivityも同様にmeta-dataを追加するが、こちらはandroid.app.searchableという名前にしてXMLのリソースを指定する。
そして、ActionBarから検索が行われたときにintentを受け取れるようにandroid.intent.action.SEARCHのアクションをintent-filterに追加する。
<activity android:name="xxx.xxx.xxx.DoSearchActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:label="@string/app_name" > <meta-data android:name="android.app.default_searchable" android:value="xxx.xxx.xxx..SearchResultActivity" /> </activity> <activity android:name="xxx.xxx.xxx.SearchResultActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:label="@string/app_name" > <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> </activity>
検索結果を表示するActivityのmeta-dataにて指定したXMLは以下のようにする。
<?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" />
android:hintを指定することで検索バーをタップした時に表示する文字を指定できる。
Action Bar | Android Developers
DoSearchActivityのActionBarに検索バーを設置する
DoSearchActivityのメニューファイルに検索バーを追加することでActionBarに検索バーを表示できる。
Android SDKにSearchViewというクラスが用意されているのでそれを利用する。
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/search" android:actionViewClass="android.widget.SearchView" android:icon="@drawable/ic_action_search" android:showAsAction="collapseActionView|ifRoom" android:title="@string/search"/> </menu>
よく見る検索のアイコンはGoogleが公式で配布しているので、ダウンロードして利用する。
Iconography | Android Developers
DoSearchActivityの設定
DoSearchActivityでは、メニューの設定でSearchViewを初期化する。
デフォルトの設定では、キーボードを閉じても検索バーが閉じてくれない。
そのため、OnFocusChangeListenerをセットしてフォーカスが他に移ったら検索バーを閉じるという処理を入れている。
参考:
android - Auto Collapse ActionBar SearchView on Soft Keyboard close - Stack Overflow
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_do_search, menu); // SearchViewの初期化 SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); final MenuItem searchMenuView = menu.findItem(R.id.search); searchView = (SearchView)searchMenuView.getActionView(); searchView.setSearchableInfo(searchManager .getSearchableInfo(getComponentName())); // 検索バーからフォーカスが移ったら、SearchViewを終了して空の文字列で検索する searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean queryTextFocused) { if(!queryTextFocused) { searchMenuView.collapseActionView(); searchView.setQuery("", false); } } }); return true; }
SearchResultActivityで検索結果を表示する
ユーザがキーワードを入れて検索をすると、Intentにそのキーワードが入る。
キーはSearchManager.QUERYなので、Intent#getStringExtra()にそのキーを指定することでユーザが入力したキーワードが取得できる。
あとはそのキーワードから検索を行い結果を表示すればよい。
Intent intent = getIntent(); if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String keyword = intent.getStringExtra(SearchManager.QUERY); // keyword を使ってデータベースから検索などをして結果を表示 }