この記事は最初のパートをマスターした人に読むことをお勧めします。 この記事では、最近の検索のヒントがダイアログに追加されるようにアプリケーションを変更する方法について説明します。 コードと理論(最初のパートで必要なものに加えて)を理解するには、コンテンツプロバイダーの知識が必要です。 公式ガイドから入手できます。
理論のビット
基本的に、最近の検索クエリヒントは保存された検索です。 ユーザーがヒントのいずれかを選択すると、検索を担当するアクティビティは、既に処理済みの文字列としてのヒントを含む検索タイプのインテントを受け取ります。 Search Managerはダイアログ全体だけでなくプロンプトの表示も担当し、コンテンツプロバイダーは保存に使用されます。
検索マネージャーがアクティビティを検索の責任と定義し、検索のヒントを提供すると、次の一連のアクションが発生します。
- Search Managerは、検索クエリのテキストを受信すると、ヒントを提供するコンテンツプロバイダーに要求を送信します。
- コンテンツプロバイダーは、検索クエリのテキストに一致するヒントを指すカーソルを返します。
- Search Managerはカーソルを使用してツールチップを表示します
プロンプトのリストが表示された後、次のことが発生する場合があります。
- ユーザーがリクエストのテキストを変更すると、上記のすべての手順が繰り返されます。
- ユーザーが検索を開始すると、プロンプトは無視されます。
- ユーザーがツールチップを選択すると、このツールチップのテキストがリクエストとしてインテントがアクティビティに配信されます。
したがって、ヒントを実装するには、次のものが必要です。
- SearchRecentSuggestionsProviderクラスから継承するコンテンツプロバイダーを作成し、マニフェストで宣言します
- コンテンツプロバイダーに関する情報を追加して、構成xmlダイアログファイルを変更する
- 検索を開始するたびにクエリを保存するようにActivtyを変更します
コンテンツプロバイダーを作成する
必要なのは、 SearchRecentSuggestionsProviderクラスの子孫であるコンテンツプロバイダーのみです。 このクラスは、開発者に対して実際にすべてのアクションを実行します。私たちに必要なのは、コンストラクターを記述することだけです。
ファイルSuggestionProvider.java
package com.example.search;
import android.content.SearchRecentSuggestionsProvider;
public class SuggestionProvider extends SearchRecentSuggestionsProvider {
public final static String AUTHORITY = "com.example.search.SuggestionProvider" ;
public final static int MODE = DATABASE_MODE_QUERIES;
public SuggestionProvider() {
setupSuggestions(AUTHORITY, MODE);
}
}
* This source code was highlighted with Source Code Highlighter .
認可文字列とコンテンツプロバイダーデータベースの操作モードは、 setupSuggestions()メソッドに渡されます。 許可文字列は任意で、唯一の要件は一意性です。 ただし、公式ドキュメントでは、パッケージの名前を含むコンテンツプロバイダーの完全な名前を使用することをお勧めします。 データベース操作モードにはDATABASE_MODE_QUERIESが含まれている必要があり、オプションでDATABASE_MODE_2LINESを追加することもできます。 2番目のケースでは、プロンプトのテーブルに列が追加され、各プロンプトに2行目を表示できます。 コードは次のようになります。
public final static int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES;
* This source code was highlighted with Source Code Highlighter .
マニフェストでコンテンツプロバイダーを宣言する必要があることを忘れないでください。
AndroidManifest.xmlファイル
<? xml version ="1.0" encoding ="utf-8" ? >
< manifest xmlns:android ="http://schemas.android.com/apk/res/android"
package ="com.example.search"
android:versionCode ="1"
android:versionName ="1.0" >
< application android:icon ="@drawable/icon" android:label ="@string/app_name" >
< activity android:name =".Main"
android:label ="@string/app_name" >
< intent-filter >
< action android:name ="android.intent.action.MAIN" />
< category android:name ="android.intent.category.LAUNCHER" />
</ intent-filter >
< intent-filter >
< action android:name ="android.intent.action.SEARCH" />
</ intent-filter >
< meta-data
android:name ="android.app.searchable"
android:resource ="@xml/searchable"
/>
</ activity >
< provider android:name =".SuggestionProvider"
android:authorities ="com.example.search.SuggestionProvider" />
</ application >
< uses-sdk android:minSdkVersion ="5" />
</ manifest >
* This source code was highlighted with Source Code Highlighter .
設定ファイルを変更する
ダイアログでコンテンツプロバイダーを使用してヒントを得るには、パラメーターandroid:searchSuggestAuthorityおよびandroid:searchSuggestSelectionを追加する必要があります
ファイル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:searchSuggestAuthority ="com.example.search.SuggestionProvider"
android:searchSuggestSelection =" ?" >
</ searchable >
* This source code was highlighted with Source Code Highlighter .
android:searchSuggestAuthorityパラメーターの値は、コンテンツプロバイダーの認証文字列と完全に一致する必要があります。
android:searchSuggestSelectionパラメーターの値は、スペースの後に配置された疑問符である必要があります。これはデータベースから選択する引数であり、疑問符はユーザーが入力したテキストに自動的に置き換えられるためです。
アクティビティの変更
クエリテキストを保存するだけです。このため、 SearchRecentSuggestionsクラスのインスタンスが作成され、 saveRecentQuery()メソッドが呼び出されます。 これは、データを検索するリクエストでIntentがActivityに入るたびに発生します。 2つのパラメーターがsaveRecentQuery()メソッドに渡されます。最初のパラメーターは必須で検索文字列を表し、2番目のパラメーターはオプションです。DATABASE_MODE_2LINESを使用してツールチップに2行目のテキストを表示する場合は必須です。
公式ドキュメントでは、ヒントテーブル全体をクリアするためのインターフェイスを提供することも推奨されています。 どうやら、これはユーザーのプライバシーを確保するために必要です。 メニュー項目をもう1つ追加するだけです。クリックすると、クエリ履歴全体が消去されます。
Main.javaファイル
package com.example.search;
import android.app.ListActivity;
import android.app.SearchManager;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.SearchRecentSuggestions;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.SimpleCursorAdapter;
public class Main extends ListActivity {
private EditText text;
private Button add;
private RecordsDbHelper mDbHelper;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//
mDbHelper = new RecordsDbHelper( this );
//
mDbHelper.open();
// Intent
Intent intent = getIntent();
// Intent
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
//
String query = intent.getStringExtra(SearchManager.QUERY);
// SearchRecentSuggestions
SearchRecentSuggestions suggestions = new SearchRecentSuggestions( this ,
SuggestionProvider.AUTHORITY, SuggestionProvider.MODE);
//
suggestions.saveRecentQuery(query, null );
//
showResults(query);
}
add = (Button) findViewById(R.id.add);
text = (EditText) findViewById(R.id.text);
add.setOnClickListener( new View.OnClickListener() {
public void onClick(View view) {
String data = text.getText().toString();
if (!data.equals( "" )) {
saveTask(data);
text.setText( "" );
}
}
});
}
private void saveTask( String data) {
mDbHelper.createRecord(data);
}
private void showResults( String query) {
//
Cursor cursor = mDbHelper.fetchRecordsByQuery(query);
startManagingCursor(cursor);
String [] from = new String [] { RecordsDbHelper.KEY_DATA };
int [] to = new int [] { R.id.text1 };
SimpleCursorAdapter records = new SimpleCursorAdapter( this ,
R.layout.record, cursor, from , to);
//
setListAdapter(records);
}
// ( res/menu/main_menu.xml)
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
return true ;
}
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.search_record:
//
onSearchRequested();
return true ;
case R.id.clear_recent_suggestions:
//
SearchRecentSuggestions suggestions = new SearchRecentSuggestions( this ,
SuggestionProvider.AUTHORITY, SuggestionProvider.MODE);
suggestions.clearHistory();
return true ;
default :
return super.onOptionsItemSelected(item);
}
}
}
* This source code was highlighted with Source Code Highlighter .
おわりに
developer.android.comのドキュメントを使用してこの記事を書きました。
変更されたプロジェクト全体はcode.google.comにあります