Adding Recent Query Suggestions
当使用Android的搜索对话框或搜索插件,您可以根据最近的搜索查询提供搜索建议。例如,如果用户以前搜索“小狗”,那么该查询,一旦他或她开始键入相同的查询显示为一个建议。图1示出了搜索对话框的最近的查询建议的例子。
在开始之前,你需要实现搜索对话框或应用程序中的基本搜索将搜索插件。如果没有,请参阅创建一个搜索界面。
基础
图1.截图一个搜索对话框中最近查询建议。
最近查询建议只保存搜索。当用户选择的建议,您的搜索活动收到的建议,作为搜索查询,它可搜索活动已经处理了(如创建搜索界面述)ACTION_SEARCH意图。
提供最近查询的建议,您需要:
实现一个可搜索的活动,如创建一个搜索界面描述。
创建一个扩展SearchRecentSuggestionsProvider内容提供商和应用程序清单申报。
修改有关提供搜索建议的内容提供者的信息搜索的配置。
保存查询到您的内容提供商每次执行搜索时。
正如Android系统会显示搜索对话框,它也显示在下面的对话框或搜索插件的搜索建议。所有你需要做的是提供从该系统可以检索建议的来源。
当系统识别出您的活动是搜索,并提供搜索建议,下面的过程,一旦发生当用户开始键入查询:
该系统以搜索查询文本(无论迄今已键入),并执行一个查询到包含您的建议内容提供商。
你的内容提供商将返回一个指向匹配搜索查询文本,所有的建议光标。
系统显示的光标提供的建议列表。
一旦近期的查询建议显示,以下可能会发生:
如果用户键入另一个键,或以任何方式改变了查询时,重复上述步骤,并建议列表被更新。
如果用户执行搜索,建议被忽略,搜索是使用正常ACTION_SEARCH意图传递到你的搜索活动。
如果用户选择一个建议,一个ACTION_SEARCH意图使用建议的文本作为查询发送到您的搜索活动。
您为内容提供商扩展SearchRecentSuggestionsProvider类自动完成上述工作,所以实际上有很少的代码来写。
创建一个内容提供商
你需要最近查询建议,内容提供商必须SearchRecentSuggestionsProvider的实现。这个类几乎一切都是为了你。所有你所要做的就是写一个类构造函数执行的一行代码。
例如,这里有一个内容提供商最近查询建议的完整实现:
public class MySuggestionProvider extends SearchRecentSuggestionsProvider { public final static String AUTHORITY = "com.example.MySuggestionProvider"; public final static int MODE = DATABASE_MODE_QUERIES; public MySuggestionProvider() { setupSuggestions(AUTHORITY, MODE); } }到setupSuggestions()的调用传递检索机构和数据库模式的名称。搜索权限可以是任何唯一的字符串,但最好的做法是使用一个完全合格的名称为您的内容提供商(包名称,后跟提供者的类名;例如,“com.example.MySuggestionProvider”)。数据库模式必须包括DATABASE_MODE_QUERIES并且可以选择包括数据库方式2LINES,增加了另一列的建议表,使您可以提供每个建议文本的第二行。例如,如果你想提供建议每两
public final static int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES;在我宣布,内容提供商在你的应用程序清单与您SearchRecentSuggestionsProvider类中使用的相同的权限字符串(和搜索的配置)。 例如:
<application> <provider android:name=".MySuggestionProvider" android:authorities="com.example.MySuggestionProvider" /> ... </application>修改检索配置
<?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_label" android:hint="@string/search_hint" android:searchSuggestAuthority="com.example.MySuggestionProvider" android:searchSuggestSelection=" ?" > </searchable>为Android值:searchSuggestAuthority应该为正好在内容提供商使用权限(在上面的例子管理局字符串)相匹配的内容提供者的全名。
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Intent intent = getIntent(); if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String query = intent.getStringExtra(SearchManager.QUERY); SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this, MySuggestionProvider.AUTHORITY, MySuggestionProvider.MODE); suggestions.saveRecentQuery(query, null); } }该SearchRecentSuggestionsProvider构造函数需要通过您的内容提供商宣布相同的权限和数据库模式。
SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this, HelloSuggestionProvider.AUTHORITY, HelloSuggestionProvider.MODE); suggestions.clearHistory();Execute this from your choice of a "Clear Search History" menu item, preference item, or button. You should also provide a confirmation dialog to verify that the user wants to delete their search history.