読者です 読者をやめる 読者になる 読者になる

【android】ActionBarでのSearchViewの基本的な使い方

はじめに

今回やりたかったことは、ActionBarに検索バーをおいて検索すると検索用の画面へ遷移するということ。
最終的にやりたいことは検索バーで検索結果画面を開くところだけど、今回は検索バーをおいてイベントをハンドリングするところまで。

f:id:yoppy0066:20170208150335g:plain:w250

検索バーをおく

まずは画面遷移とかは考えずにとりあえず検索バーをおくだけ。

res/menu/main.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
  <item
      android:id="@+id/search_menu_search_view"
      app:actionViewClass="android.support.v7.widget.SearchView"
      app:showAsAction="always" />
</menu>

MainActivity.java

public class MainActivity extends AppCompatActivity {

    SearchView mSearchView;

    ・・・

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);

        // 検索バーを追加(必須)
        getMenuInflater().inflate(R.menu.main, menu);

        // 文字色、サイズの変更とプレースホルダーセット(任意)
        SearchView.SearchAutoComplete searchAutoComplete = (SearchView.SearchAutoComplete)
            mSearchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
        searchAutoComplete.setHintTextColor(Color.rgb(0xff, 0xff, 0xff));
        searchAutoComplete.setTextSize(25);
        searchAutoComplete.setHint("検索キーワード");

        return true;
    }
}

検索ボタンのイベントをハンドリング

次に検索された時のイベントをハンドリング
MainActivityでSearchFragment.SearchFragmentListenerをimplementsして、SearchView.OnQueryTextListenerを実装すればok。

MainActivity.java

public class MainActivity extends AppCompatActivity implements SearchFragment.SearchFragmentListener {
    ・・・

    @Override
        public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.main, menu);

        // ★  追加
        MenuItem menuItem = menu.findItem(R.id.search_menu_search_view);
        mSearchView = (SearchView) menuItem.getActionView();
        mSearchView.setOnQueryTextListener(this.onQueryTextListener);
    }

    // ★ 追加
    private SearchView.OnQueryTextListener onQueryTextListener = new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String searchWord) {
            // ★ 検索ボタンでここが呼ばれる
            return true;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            return false;
        }
    };
}

以上です