i++

プログラム系のメモ書きなど

Android : SearchView での検索時に追加の情報(Context Data)を渡す

SearchDialog 使用時には、検索を実行する Activity の onSearchRequested() をオーバーライドしてその中で Bundle にデータを入れる方法が記載されていますが、SearchView (SearchWidget) の場合の実装方法は記載がありません。

いろいろ調べた結果、SearchView の setOnqueryTextListener を使い、onQueryTextSubmit 時に検索 Intent を自分で作成して発行する方法がもっともわかりやすいと思います。

(一方、Activity の LaunchMode を singleTop にしていて同じ Activity で検索の実行(SearchView の表示)と検索処理(検索Intentのハンドリング)を行う場合、メンバー変数とかを使うだけで済むのでより簡単に)

検索実行側
mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
    @Override
    public boolean onQueryTextSubmit(String query) {
        // キーボードを閉じる
        InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(mSearchView.findFocus().getWindowToken(), 0);
        // この例では検索を実行するアクティビティも検索を受け取るアクティビティも同じ
        Intent intent = new Intent(MainActivity.this, MainActivity.class);
        intent.setAction(Intent.ACTION_SEARCH);
        intent.putExtra(SearchManager.QUERY, query);
        // 追加データ。onSearchRequested に合わせるなら Bundle にまとめた方がよいかも
        intent.putExtra("Extra", "somevalue");
        startActivity(intent);
        return true;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        return false;
    }
});
検索受け取り側
if(Intent.ACTION_SEARCH.equals(intent.getAction())) {
    String query = intent.getStringExtra(SearchManager.QUERY);
    String somevalue = intent.getStringExtra("Extra");
    if(mSearchView != null)
    {
        mSearchView.setQuery(query, false);
    }
    // 検索して表示する処理...
}