i++

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

Android : SearchView の Voice 入力の結果を表示する

音声入力終了後には onNewIntent が呼ばれるので、その中で拾った検索語を SearchView#setQuery(query, false) でセットします。第二引数は setQuery でセットした語で検索を実行するかどうかなので、true にすると無限ループに陥ります。

  • (個人的には)Activity の LaunchMode を singleTop にして同じアクティビティで検索の Intent を受け取るようにしていたほうが処理しやすい
Activity の音声入力の結果を受け取る部分
@Override
protected void onNewIntent(Intent intent) {
    setIntent(intent);
    handleIntent(intent);
}

private void handleIntent(Intent intent) {
    if(Intent.ACTION_SEARCH.equals(intent.getAction())) {
        String query = intent.getStringExtra(SearchManager.QUERY);
        if(mSearchView != null)
        {
            mSearchView.setQuery(query, false);
        }
    }
}
カスタム Search ダイアログの作成と表示
AlertDialog.Builder builder = new AlertDialog.Builder(this);
View view = View.inflate(this, R.layout.search_dialog, null);

mSearchView = (SearchView) view.findViewById(R.id.search_dialog_searchview);

SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
    @Override
    public void onDismiss(DialogInterface dialog) {
        mSearchView = null;
    }
});
builder.setView(view);
AlertDialog dialog = builder.create();
dialog.getWindow().setGravity(Gravity.TOP|Gravity.CENTER_HORIZONTAL);
dialog.show();
searchable.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="Search"
  android:voiceSearchMode="showVoiceSearchButton|launchRecognizer">
</searchable>

Creating a Search Interface | Android Developers