後方互換性を維持する

SearchView とアクションバーを利用できるのは、Android 3.0 以降に限られます。それよりも古いプラットフォームをサポートするには、検索ダイアログを代替手段として利用します。検索ダイアログは、システムが提供する UI であり、呼び出されるとアプリの上にオーバーレイされます。

最小 API レベルと対象 API レベルを設定する

検索ダイアログを設定するには、まずマニフェスト内で、古いデバイスをサポートすることと、Android 3.0 以降のバージョンを対象とすることを宣言します。これを宣言すると、アプリは自動的に Android 3.0 以降を搭載したデバイスではアクションバーを使用し、それより古いデバイスでは従来のメニュー システムを使用するようになります。

    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15" />

    <application>
    ...
    

古いデバイスの場合に検索ダイアログを提供する

古いデバイス上で検索ダイアログを呼び出すには、ユーザーがオプション メニューから検索メニュー項目を選択するたびに、onSearchRequested() を呼び出します。Android 3.0 以降を搭載しているデバイスの場合、アクションバー内に SearchView が表示されるため(最初のレッスンを参照)、3.0 よりも古いバージョンに限り、ユーザーが検索メニュー項目を選択したときに onOptionsItemSelected() が呼び出されます。

Kotlin

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {
            R.id.search -> {
                onSearchRequested()
                true
            }
            else -> false
        }
    }
    

Java

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.search:
                onSearchRequested();
                return true;
            default:
                return false;
        }
    }
    

実行時に Android ビルド バージョンをチェックする

実行時にデバイスのバージョンをチェックして、古いデバイスだった場合に、サポートされていない SearchView を使用しないようにします。onCreateOptionsMenu() メソッド内でバージョン チェックを行うサンプルコードを以下に示します。

Kotlin

    override fun onCreateOptionsMenu(menu: Menu): Boolean {

        menuInflater.inflate(R.menu.options_menu, menu)

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
            (menu.findItem(R.id.search).actionView as SearchView).apply {
                setSearchableInfo(searchManager.getSearchableInfo(componentName))
                setIconifiedByDefault(false)
            }
        }
        return true
    }
    

Java

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.options_menu, menu);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            SearchManager searchManager =
                    (SearchManager) getSystemService(Context.SEARCH_SERVICE);
            SearchView searchView =
                    (SearchView) menu.findItem(R.id.search).getActionView();
            searchView.setSearchableInfo(
                    searchManager.getSearchableInfo(getComponentName()));
            searchView.setIconifiedByDefault(false);
        }
        return true;
    }