Android API Guides---Adding Recent Query Suggestions

Adding Recent Query Suggestions

当使用Android的搜索对话框或搜索插件,您可以根据最近的搜索查询提供搜索建议。例如,如果用户以前搜索“小狗”,那么该查询,一旦他或她开始键入相同的查询显示为一个建议。图1示出了搜索对话框的最近的查询建议的例子。


在开始之前,你需要实现搜索对话框或应用程序中的基本搜索将搜索插件。如果没有,请参阅创建一个搜索界面。


基础

Android API Guides---Adding Recent Query Suggestions_第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>
修改检索配置
要配置系统使用你的建议提供者,你需要添加了android:searchSuggestAuthority和android:搜索建议选择属性到<搜索>元素在你的搜索配置文件。 例如:

<?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应该为正好在内容提供商使用权限(在上面的例子管理局字符串)相匹配的内容提供者的全名。
为Android值:searchSuggestSelection必须是一个问号,用一个空格(“?”),这简直是对SQLite的选择参数(这是由用户输入的查询文本自动替换)的占位符开头。
保存查询
要填充你最近的查询集合中,添加您的搜索活动收到您的SearchRecentSuggestionsProvider每个查询。要做到这一点,创建SearchRecentSuggestions的一个实例,并调用保存最近查询()每次可搜索活动接收到查询。例如,这里是你如何可以在活动的onCreate()方法中保存查询:

@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构造函数需要通过您的内容提供商宣布相同的权限和数据库模式。
该saveRecentQuery()方法搜索字符串作为第一个参数和可选的第二个字符串作为包含的建议(或空)的第二行。如果您启用了两线式模式与数据库方式2LINES搜索建议的第二个参数时才使用。如果您已启用两线模式,则查询文本也反对这种二线匹配时,系统查找匹配的建议。
清除数据建议
为了保护用户的隐私,你应该始终为用户提供清除最近查询建议的方式。要清除查询历史记录,调用clearHistory()。 例如:

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.

你可能感兴趣的:(java,android,api,search,sdk)