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>