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

うさがにっき

読書感想文とプログラムのこと書いてきます

actionBarでの検索機能を実装

概要

actionbarでappcompatを使った検索機能を実装するサンプルがこれといったものが見つからなかったので、ANDROID_HOME/sample下にあるApiDemosを参考に作ってみる

詳細

apiDemosについては以下を参考に
サンプル「ApiDemos」の構造:「Androidアプリ開発逆引き大全500の極意」付録文書


下記、SearchViewActionBarを参考にする

package com.example.android.apis.view;

public class SearchViewActionBar extends Activity implements SearchView.OnQueryTextListener {

onCreate()ではレイアウトを設定して、TextViewを取得しているだけ

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().requestFeature(Window.FEATURE_ACTION_BAR);

        setContentView(R.layout.searchview_actionbar);

        mStatusView = (TextView) findViewById(R.id.status_text);
    }

onCreateOptionsMenuでoptionmenuの設定を行っている

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

        // menuのレイアウトを設定
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.searchview_in_menu, menu);
        // menuの中からsearch用のmenuを取得
        MenuItem searchItem = menu.findItem(R.id.action_search);
        mSearchView = (SearchView) searchItem.getActionView();
        setupSearchView(searchItem);

        return true;
    }

menu/searchview_in_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:compat="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/searchView"
        android:icon="@drawable/challenge_search"
        android:showAsAction="always"
        android:title="searchBar"
        compat:actionViewClass="android.support.v7.widget.SearchView"/>
</menu>

actionBarでの扱いを記述
searchManagerについてはhttp://y-anz-m.blogspot.jp/2010/03/android-searchmanager.htmlにわかりやすく書いてある

searchviewのjavadocに以下のようにある
If you want the search field to always be visible, then call setIconifiedByDefault(false).
が、これをしても全然表示されない…

    private void setupSearchView(MenuItem searchItem) {
        searchItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM
                | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);

        // 入力候補を表示する
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        if (searchManager != null) {
            List<SearchableInfo> searchables = searchManager.getSearchablesInGlobalSearch();

            // Try to use the "applications" global search provider
            SearchableInfo info = searchManager.getSearchableInfo(getComponentName());
            for (SearchableInfo inf : searchables) {
                if (inf.getSuggestAuthority() != null
                        && inf.getSuggestAuthority().startsWith("applications")) {
                    info = inf;
                }
            }
            mSearchView.setSearchableInfo(info);
        }

        mSearchView.setOnQueryTextListener(this);
    }

あとはinterfaceに必要なメソッド追加

    public boolean onQueryTextChange(String newText) {
        mStatusView.setText("Query = " + newText);
        return false;
    }

    public boolean onQueryTextSubmit(String query) {
        mStatusView.setText("Query = " + query + " : submitted");
        return false;
    }

    public boolean onClose() {
        mStatusView.setText("Closed!");
        return false;
    }