Androidシステム検索ダイアログ(フロート検索ボックス)の使用


あなたがあなたのアプリケーションで検索サービスを提供する必要がありますが、最初に思いついたのはあなたの検索ボックスはどこに置くべきですか?Androidの検索フレームを使用すると、アプリケーションはユーザーの検索要求を処理するためのカスタム検索ダイアログを表示します.簡単な検索ボタンやアプリケーションからAPIを呼び出すと、検索ダイアログが画面の上部に表示され、アプリケーションのアイコンが自動的に表示されます.下図のように:
ここでは、あなたのアプリケーションのための独自の検索ダイアログを提供する方法を教えます.このようにして、ユーザーに標準化された検索体験を提供し、音声検索や検索アドバイスなどの機能を追加することができます.
基礎知識
Androidの検索フレームはあなたの管理する検索ダイアログの代わりになります.自分で検索ボックスを開発する必要はありません.検索ボックスをどの位置に置くか心配する必要はありません.検索ボックスが現在の画面に影響する心配もありません.これらのすべての作業はSearch Managerクラスが処理します.Android検索ダイアログのライフサイクル全体を管理し、あなたのアプリケーションを実行して検索要求を送り、該当する検索キーワードを返します.
ユーザが検索を実行すると、検索マネージャは専用のIntentを使って検索キーワードをプロファイルに設定された検索結果のActivityに転送します.本質的には、すべての必要なのは、ActivityがIntentを受信し、検索を実行し、結果を与えることです.具体的には、あなたが必要とすることには以下の内容が含まれています.
検索プロファイル
私たちはXMLプロファイルを使って検索ダイアログを構成しています.テキストボックスなどの機能構成を含み、音声検索や検索提案に表示される提示テキストなどを設定しています.
検索要求を処理するためのActivity
このActivityは検索クエリの内容を受信し、あなたのデータを検索して検索結果を表示します.
ユーザーが検索を実行するルート
デフォルトでは、検索可能なActivityを設定すると、デバイス検索キー(あれば)が検索ダイアログを呼び出します.しかし、オプションメニューの検索ボタンや他のユーザーインターフェースのボタンなどの検索ダイアログを呼び出すことができるように、常に別の手段を提供してください.すべてのデバイスが専用の検索キーを提供していないからです.
検索ダイアログのプロファイルを作成します.
検索ボックスの設定ファイルは、あなたのアプリケーション内の検索ボックスの設定を設定するためのXMLファイルです.このファイルは一般的にsearchable.xmlと命名され、プロジェクトのres/xml/ディレクトリの下に保存しなければなりません.
プロファイルを設定するルートノードは、1つ以上の属性を持つことができます.下図のように:
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/searchLabel" android:hint="@string/searchHint">
</searchable>
上記のプロファイルでは、Android:hint属性以外は検索ダイアログで必要な設定項目であり、Android:labelは必須の属性であり、その値はstringリソースの参照であり、文字列を直接使用することはできません.通常はアプリケーションの名前です.(必須の属性ですが、通常は検索推奨機能が起動されていない限りは表示されません.)android:hintは検索ボックスの入力ヒント情報です.また、string.xmlに配置されている文字列リソースを参照してください.直接文字列を使用することはできません.
多くの属性を設定することができますが、ほとんどの属性は検索提案と音声検索を使用して構成するだけです.それでも、ユーザーが入力したい情報を提示するために、android:hintを必ず設定してください.
次に、このプロファイルをあなたのアプリケーションに置く必要があります.
検索に使用できるActivityを作成します.
ユーザーが一つの検索ボックスから検索を実行すると、検索マネージャはACTION_SEARCH_Intentを介して検索対象のコンテンツ(キーワード)を検索実行可能なActivityに送信します.このAcitivityクエリデータは結果を表示します.
検索可能なActivityを定義します.
準備ができていない場合は、検索を実行するためのActivityを作成し、ACTION_SEARCH Intentに応答して検索ボックスの設定情報を追加することができると宣言しました.そのためには、要素とファイルの中のノードを追加する必要があります.

<application ... >
    <activity android:name=".MySearchableActivity" >
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>
        <meta-data android:name="android.app.searchable"
                   android:resource="@xml/searchable"/>
    </activity>
    ...
</application>
のAndroid:name属性値は、必ず「android.ap.searchable」であり、android:resource属性値は、上記のようなres/xml/ディレクトリの検索プロファイル(本例では、res/xml/searchable.xml)を参照してください.
なお、上記のmeta-dataノードが配置されたActivityのノードのみが検索を実行することができ、アプリケーション全体で検索ボックスを呼び出すことができれば、以下のような構成が可能である.

<application ... >
    <activity android:name=".MySearchableActivity" >
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>
        <meta-data android:name="android.app.searchable"
                   android:resource="@xml/searchable"/>
    </activity>
    <activity android:name=".AnotherActivity" ... >
    </activity>
    <!—                       -->
    <meta-data android:name="android.app.default_searchable"
               android:value=".MySearchableActivity" />
    ...
</application>
上のコードの中でアンディ:name="android.app.defaultcurhable"は検索ボックスの検索要求に応答する名前を定義しています.android:valueはどのActivityに応答して検索を実行するかを指定します.アプリケーションのOtherAcitivityで検索要求を実行すると、MySearchable Activityは検索結果をロードして検索結果を表示します.
検索を実行
Activity宣言が検索可能である場合、実際の検索を実行するには、クエリーを受信し、データを検索し、結果を提出する三つのステップがあります.
通常、あなたの検索結果はListViewに表示される必要がありますので、検索を実行するAcitivityはListActivityを引き継ぎます.このように、ListViewのアプリにアクセスしやすいです.
検索の受信
検索ダイアログから検索を実行すると、先ほど構成された検索用のAcitivityがIntentによって活性化されます.検索関連のパラメータをいくつか持っています.Intentを確認してから検索応答を行う必要があります.
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.search);
 
    Intent intent = getIntent();
//         
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
//         (   )
      String query = intent.getStringExtra(SearchManager.QUERY);
//         
      doMySearch(query);
    }
}
doMySearch()方法は、キーワードに基づいてデータベースを検索したり、インターネットからデータを検索したりします.時間がかかる検索であれば、プログレスバーを使って、検索が行われていることをユーザーに伝えます.最後に結果を返したら、ListViewのsetAdapter()を呼び出して、結果をListViewに表示します.
検索ダイアログを呼び出す
メニューから検索ボックスをアクティブにするなど、アプリケーションのどこからでも呼び出します.また、ユーザーがキーボードのキーを押すと、自動的に検索ボックスがアクティブになります.
検索ボックスは通常のダイアログと同様に、画面の一番上に浮遊しています.Activityスタックの状態は変わりません.Activityライフサイクルのいずれもない方法で呼び出されます.検索ボックスが現れたら、実行中のActivityは入力フォーカスを失うだけです.
検索を実行する時に別の操作をすると、オンSearch Requested()の方法を書き換えることができます.
@Override
public boolean onSearchRequested() {
//           ,          
    pauseSomeStuff();
    return super.onSearchRequested();
}
現在のActivityが検索要求に応答するActivityである場合、以下の2つのケースがあります.
デフォルトでは、ACTION_SEARCH Intentが新たなActivityを作成し、オンクリアーを呼び出します.この新しいActivityは一番前に表示されます.同時に二つのActivityのインスタンスがあります.「戻る」ボタンを押すと、検索を実行していない前のActivityに戻ります.
もう一つの場合はアンディ:launchMode="singleTop"を配置したActivityです.
OnewIntent(Intent)メソッドで検索要求を処理すると、以下のようになります.
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.search);
    handleIntent(getIntent());
}
 
@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);
      doMySearch(query);
    }
}
対応するActivityの配置は以下の通りです.
<activity android:name=".MySearchableActivity"
              android:launchMode="singleTop" >
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    <meta-data android:name="android.app.searchable"
                      android:resource="@xml/searchable"/>
  </activity>
検索ボックスにパラメータを追加するにはどうすればいいですか?
検索ボックスにパラメータを伝達するには、OneSearch Requested()を書き換える方法が必要です.
@Override
public boolean onSearchRequested() {
     Bundle appData = new Bundle();
     appData.putBoolean(MySearchableActivity.JARGON, true);
     startSearch(null, false, appData, false);
     return true;
 }
私たちのActivityは検索ボックスの検索要求を受けた時、以下の方法でパラメータを取得します.
Bundle appData = getIntent().getBundleExtra(SearchManager.APP_DATA);
 if (appData != null) {
     boolean jargon = appData.getBoolean(MySearchableActivity.JARGON);
 }
最後に、androidの音声検索の使い方を見てみましょう.
私たちの検索プロファイルを以下のように変更するだけで、あなたの検索は音声検索をサポートします.構成ファイルは以下の通りです.
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/searchLabel"
    android:hint="@string/searchHint"
    android:voiceSearchMode="showVoiceSearchButton|launchRecognizer">
</searchable>
はい、今日はここまでにして、自分で練習しましょう.今後は検索提案や音声検索などの内容を詳しく説明します.
原文の住所:
http://www.ideasandroid.com/?p=310