SearchViewウィジェットを含むアクティビティがあります。onQueryTextSubmitリスナーを使用してテキスト検索の結果を処理していますが、これは正常に機能します。(アクティビティ自体は検索可能アクティビティとして指定されます)。
最近、searchable.xmlファイルに「voiceSearchMode」属性を追加して音声認識を追加することにしました。
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="@string/search_hint"
android:voiceSearchMode="showVoiceSearchButton|launchRecognizer">
</searchable>
音声認識を追加したとき、音声入力を提供した後にonQueryTextSubmitリスナーが呼び出されません(ただし、editTextボックスを使用してテキスト入力を提供した後も呼び出されます)。音声認識機能は、ACTION_SEARCHインテントを同じアクティビティ(onCreateメソッドで処理できます)に送り返します。音声レコグナイザー(またはアクティビティを再作成する必要のない同様のもの)を使用してonQueryTextSubmitメソッドをアクティブ化する方法はありますか?私が尋ねている理由は、レコグナイザーがインテントを送信する必要がある場合、作成してAPP_DATAを使用して追加のバンドルを送信しますが、機能していないようです。
だから私の質問は:
(1)音声認識検索が有効になっているonQueryTextSubmitリスナーをどのように使用しますか(または使用できますか)?(通常のテキストベースの検索で使用するのと同じ方法)
(2)(1)が不可能な場合、インテントを介して音声認識検索クエリで追加データを渡すにはどうすればよいですか?私は次のようにonSearchRequested()を介してそれを追加しようとしました:
@Override
public boolean onSearchRequested() {
Bundle appData = new Bundle();
appData.putInt("testKey", 44);
this.startSearch(null, true, appData, false);
return true;
}
しかし、onCreateでこれにアクセスしようとすると、appDataはnullになります。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.overview_list);
Bundle extras = getIntent().getExtras();
Bundle appData = getIntent().getBundleExtra(SearchManager.APP_DATA);
// Receive search intents (from voice recognizer)
Intent intent = getIntent();
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
//doMySearch(query);
}
}
(また、onSearchRequestedハンドラーを追加するときに、虫眼鏡アイコンを押すと、検索ウィジェットを2回重ねて展開する効果があります。これは、検索可能なxmlを設定したことに加えて、手動で検索を開始しているためだと思います。構成)。
関連するメモとして、同じアクティビティ内でリスナーを使用するよりもインテントを送信することの利点は何ですか?SearchableActivityが別のアクティビティである場合は、それにインテントを送信することをお勧めします。しかし、SearchableActivityが検索ウィジェットを含む同じアクティビティである場合、インテントを使用する意味は何ですか?
コメントや提案をいただければ幸いです。追加の詳細を提供する必要がある場合はお知らせください。