phicdy devlog

Androidアプリ開発やその他技術系の記事をたまに書きます

AndroidとかiOSとかモバイル多め。その他技術的なことも書いていきます。

【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を指定することで検索バーをタップした時に表示する文字を指定できる。


http://developer.android.com/images/ui/actionbar-searchview@2x.png

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 を使ってデータベースから検索などをして結果を表示
}