日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
為Android應(yīng)用增加搜索功能:增加搜索建議

在上一篇教程<<為Android應(yīng)用添加搜索功能>>中,我們學(xué)習(xí)了如何在android應(yīng)用中其搜索框架的基本功能,在本講中,將繼續(xù)學(xué)習(xí)在搜索應(yīng)用中增加搜索提示建議的功能。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專(zhuān)注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、小程序設(shè)計(jì)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶(hù)創(chuàng)新互聯(lián)還提供了鹽湖免費(fèi)建站歡迎大家使用!

什么是搜索建議

首先我們來(lái)看下什么是搜索建議。在A(yíng)ndroid應(yīng)用中,當(dāng)用戶(hù)輸入搜索字符串是,系統(tǒng)會(huì)根據(jù)輸入的字符串的部分或整體,以下拉框的方式列出含有用戶(hù)輸入字符串的列表,這樣用戶(hù)就可以不必輸入完所有字符,可以直接從下拉列表中選擇,方便了用戶(hù)。如果能在A(yíng)PP應(yīng)用的搜索模塊中加入這個(gè)功能,對(duì)用戶(hù)來(lái)說(shuō)無(wú)疑是十分方便的,下圖是在搜索應(yīng)用中使用搜索建議的圖:

搜索建議的兩類(lèi)模式

要讓搜索應(yīng)用支持搜索建議,必須在應(yīng)用中增加一個(gè)自定義的content provider,并且要設(shè)置配置文件中的搜索元數(shù)據(jù)。

Android支持兩種類(lèi)型的搜索建議模式:

· 基于用戶(hù)輸入的搜索建議

· 基于A(yíng)PP應(yīng)用本身數(shù)據(jù)庫(kù)的搜索建議,即從APP應(yīng)用數(shù)據(jù)庫(kù)中提取數(shù)據(jù)做搜索建議

下面分別講解兩種搜索建議方式是如何配置的:

基于用戶(hù)輸入的搜索建議

這種方式相對(duì)比較容易,先來(lái)介紹下。在A(yíng)ndroid中,提供了SearchRecentSuggestionsProvider這個(gè)類(lèi),可以實(shí)現(xiàn)從用戶(hù)最近輸入的內(nèi)容中進(jìn)行檢索,開(kāi)發(fā)者只需要做的,只需要繼承這個(gè)類(lèi),并且在構(gòu)造函數(shù)中進(jìn)行如下設(shè)置:

 
 
 
 
  1. import android.content.SearchRecentSuggestionsProvider; 
  2. publicclass SampleRecentSuggestionsProvider 
  3. extends SearchRecentSuggestionsProvider { 
  4. public static final String AUTHORITY = 
  5. SampleRecentSuggestionsProvider.class.getName(); 
  6. public static final int MODE =DATABASE_MODE_QUERIES; 
  7. public SampleRecentSuggestionsProvider() { 
  8. setupSuggestions(AUTHORITY, MODE); 

在上面的這個(gè)類(lèi)中,繼承了SearchRecentSuggestionsProvider,并且在構(gòu)造函數(shù)中進(jìn)行了設(shè)置,這樣這個(gè)自定義的contentprovider就擁有了查詢(xún)用戶(hù)最近輸入檢索的能力了。

但必須同時(shí)保存用戶(hù)曾經(jīng)的檢索輸入,這樣就能在用戶(hù)再次輸入時(shí),重新顯示出來(lái),這個(gè)必須在search的activity中,寫(xiě)入如下代碼:

 
 
 
 
  1. SearchRecentSuggestions suggestions = 
  2. newSearchRecentSuggestions(this, 
  3. SampleRecentSuggestionsProvider.AUTHORITY, 
  4. SampleRecentSuggestionsProvider.MODE); 
  5. suggestions.saveRecentQuery(query, null); 

上面的代碼中可以看到,使用了SearchRecentSuggestionsProvider的

saveRecentQuery方法進(jìn)行了搜索記錄的保存。

接下來(lái),在配置文件中必須對(duì)這個(gè)contentprovider進(jìn)行配置,如下:

 
 
 
 
  1. android:authorities="de.openminds.SampleRecentSuggestionsProvider" 
  2. android:name=".SampleRecentSuggestionsProvider"> 
  3.  

***,在searchable.xml中進(jìn)行配置即可使用,如下:

 
 
 
 
  1.  
  2. android:label="@string/search_label" 
  3. android:hint="@string/search_hint" 
  4. android:searchSettingsDescription="@string/search_settings_description" 
  5. android:searchSuggestAuthority="com.grokkingandroid.SampleRecentSuggestionsProvider " 
  6. android:searchSuggestIntentAction="android.intent.action.SEARCH" 
  7. android:searchSuggestThreshold="1" 
  8. android:includeInGlobalSearch="true" 
  9. android:searchSuggestSelection=" ?" 
  10.  

其中的一些參數(shù)說(shuō)明如下:

android:searchSuggestAuthorith

此屬性的值就是SearchSuggestAuthorith中的AUTHORITH了。

android:searchSuggestIntentAction

此屬性定義了當(dāng)我們選中搜索提示的內(nèi)容時(shí)發(fā)生的目的動(dòng)作。

android:searchSuggestThreshold

此屬性定義了至少輸入幾個(gè)字符時(shí)才會(huì)彈出提示

android:includeInGlobalSearch

是否將內(nèi)容加入android的全局搜索。true,加入。

android:searchSuggestSelection

定義搜索時(shí)參數(shù)的占位符

Android中數(shù)據(jù)庫(kù)保存的搜索記錄

SearchRecentSuggestionsProvider將用戶(hù)最近的搜索記錄保存在suggestions.db中,這個(gè)db保存了id,query查詢(xún)項(xiàng),一個(gè)顯示的文本和搜索時(shí)候的時(shí)間戳。注意的是這個(gè)時(shí)間戳是必須的,因?yàn)樗械乃阉饔涗浂际前磿r(shí)間排序的。

作為開(kāi)發(fā)者來(lái)說(shuō),應(yīng)該考慮定期清理搜索記錄,或者提供給用戶(hù)手動(dòng)清除搜索記錄的機(jī)會(huì),以讓用戶(hù)定期從搜索建議列表中看到更多的搜索建議項(xiàng)。清除搜索建議記錄是十分容易的,只需要調(diào)用SearchRecentSuggestions對(duì)象的clearHistory()方法即可。Android會(huì)默認(rèn)保留250個(gè)搜索建議項(xiàng)在系統(tǒng)中。

基于應(yīng)用的搜索建議

在更多情況下,開(kāi)發(fā)者希望是提供給用戶(hù)基于app應(yīng)用本身的搜索功能,這樣用戶(hù)在搜索時(shí),將基于A(yíng)PP應(yīng)用本身的內(nèi)容提供給用戶(hù)搜索建議。這個(gè)時(shí)候,在自定義provider中,只需要關(guān)注query()和getContentType()就可以了。

首先,在應(yīng)用中必須獲得用戶(hù)在搜索文本框中輸入的內(nèi)容,然后再調(diào)用query()方法去搜索app應(yīng)用。這個(gè)可以通過(guò)如下兩類(lèi)方法去獲得用戶(hù)的輸入內(nèi)容

· 默認(rèn)的是通過(guò)URI的方式獲得用戶(hù)的輸入內(nèi)容

· 在配置文件中的查詢(xún)字符串

先看下如何過(guò)URI的方式獲得用戶(hù)的輸入內(nèi)容。系統(tǒng)都會(huì)通過(guò)query()函數(shù)在Content Provider中進(jìn)行查詢(xún),然后用Cursor返回對(duì)應(yīng)的suggestion。系統(tǒng)對(duì)用戶(hù)的輸入,構(gòu)造成如下的URI:

content://authority/optionalPath/SUGGEST_URI_PATH_QUERY /queryText

注意這里的Uri末尾的querytext是用URL方式進(jìn)行編碼的,所以你需要解碼。

一般都是采用如下的方式取得它:Stringquery = uri.getLastPathSegment().toLowerCase();

這里的optional.suggest.path就是在searchable配置文件中設(shè)置的android:searchSuggestPath,如果在searchable配置文件沒(méi)有設(shè)置它,optional.suggest.path當(dāng)然也不會(huì)包括在uri中。只有需要一個(gè)ContentProvider為多個(gè)searchable activities提供suggestions查詢(xún)的時(shí)候,才需要設(shè)置android:searchSuggestPath,這時(shí)它用于區(qū)分是哪個(gè)searchableactivities。

注意:SUGGEST_URI_PATH_QUERY 并不是URI的字面字符串,它是一個(gè)靜態(tài)成員常量,表示是把該常量的值加到uri中

下面是相關(guān)的使用方法代碼:

 
 
 
 
  1. public Cursor query(Uri uri, String[] projection, String selection, 
  2. String[] selectionArgs, String sortOrder){ 
  3. String query = uri.getLastPathSegment(); 
  4. if (SearchManager.SUGGEST_URI_PATH_QUERY.equals(query)) { 
  5. //如果找到符合用戶(hù)輸入的記錄 
  6. else { 
  7. //如果找不到符合用戶(hù)輸入的記錄 

接著看下如何在配置文件中進(jìn)行查詢(xún)字符串的設(shè)置。可以在配置文件中進(jìn)行如下配置,增加android:searchSuggestSelection選項(xiàng),如下:

android:searchSuggestSelection="namelike ?"

那么query()方法代碼如下:

 
 
 
 
  1. public Cursor query(Uri uri, String[]projection, String selection, 
  2. String[]selectionArgs, String sortOrder) { 
  3. if (selectionArgs!= null && selectionArgs.length > 0 &&selectionArgs[0].length() > 0) { 
  4. // 用戶(hù)輸入內(nèi)容保存在 selectionArgs[0] 中 
  5. else { 
  6. // 用戶(hù)沒(méi)輸入任何內(nèi)容 

此外,還可以在配置文件中配置搜索建議的最短字符數(shù),比如android:searchSuggestThreshold="3",則表明,用戶(hù)至少輸入3個(gè)字符后,才開(kāi)始調(diào)用搜索建議項(xiàng)。

處理返回的結(jié)果

下面講解如何處理搜索建議返回給前端界面的問(wèn)題。首先要在配置文件中,配置使用哪個(gè)action并且使用哪一個(gè)URI(這個(gè)URI其實(shí)就是搜索建議項(xiàng)的***數(shù)據(jù)來(lái)源列表),配置如下:

  android:searchSuggestIntentAction =

"android.intent.action.VIEW"

android:searchSuggestIntentData =

"content://someAuthority/somePath"

對(duì)返回的搜索建議項(xiàng),是以一個(gè)cursor的方式返回的,各個(gè)列必須嚴(yán)格遵守相關(guān)的規(guī)定,下面是幾個(gè)重要的列的列表:

常量

用法

SUGGEST_COLUMN_TEXT_1

要在***行顯示的文本

SUGGEST_COLUMN_TEXT_2

在第二行顯示的文字

SUGGEST_COLUMN_INTENT_DATA_ID

添加到data_uri的額外的id

雖然說(shuō)只有Searchmanager.SUGGEST_COLUMN_TEXT_1是強(qiáng)制要求的,但由于要知道用戶(hù)選擇的是哪一個(gè)選項(xiàng),因此一般來(lái)說(shuō),id選項(xiàng)也是需要的。

此外,還需要將查詢(xún)出來(lái)的搜索數(shù)據(jù)轉(zhuǎn)換為cursor的數(shù)據(jù)格式,這個(gè)需要進(jìn)行一點(diǎn)轉(zhuǎn)換工作。這可以使用SQLITEQueryBuilder的setprojectionMap方法進(jìn)行轉(zhuǎn)換,在下一篇教程中,將會(huì)具體講解其用法,這里先列出相關(guān)代碼如下:

 
 
 
 
  1. Map projectionMap = newHashMap(); 
  2.  
  3. projectionMap.put(COL_BAND, COL_BAND +" AS " + SearchManager.SUGGEST_COLUMN_TEXT_1); 
  4.  
  5. projectionMap.put(COL_ID, COL_ID); 
  6.  
  7. projectionMap.put(COL_ROW_ID,COL_ROW_ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID); 
  8.  
  9. projectionMap.put(COL_LOCATION,COL_LOCATION + " AS " + SearchManager.SUGGEST_COLUMN_TEXT_2); 
  10.  
  11. projectionMap.put(COL_DATE, COL_DATE); 
  12.  
  13. builder.setProjectionMap(projectionMap); 

響應(yīng)用戶(hù)搜索的intent

當(dāng)用戶(hù)輸入搜索詞后,Android的搜索框架將調(diào)用manifest文件中配置的搜索的activity,這其中會(huì)使用顯式的intent去實(shí)現(xiàn)。就在app中搜索用的搜索建議而言,這個(gè)intent會(huì)包括在配置文件中的數(shù)據(jù)和從cursor中返回的數(shù)據(jù)。

對(duì)用戶(hù)搜索的響應(yīng)的具體處理,取決于使用的是基于用戶(hù)已經(jīng)輸入過(guò)的搜索詞的搜索建議,還是基于A(yíng)PP應(yīng)用本身數(shù)據(jù)提供的搜索建議。

如果使用了基于用戶(hù)已經(jīng)輸入過(guò)的搜索詞的搜索建議,那么intent的action就是Intent.ACTION_SEARCH ,這和上一篇教程中談到的是一樣的。

對(duì)于基于A(yíng)PP應(yīng)用本身數(shù)據(jù)提供的搜索建議的情況,用戶(hù)大多數(shù)情況下,希望看到的是數(shù)據(jù)的詳細(xì)的情況,所以點(diǎn)了提供的搜索建議后,期望跳轉(zhuǎn)看到數(shù)據(jù)的詳情,這個(gè)可以通過(guò)設(shè)置Intent.ACTION_VIEW來(lái)實(shí)現(xiàn)。

由于搜索的activity一般會(huì)繼承ListActivity,所以一般情況下需要另外打開(kāi)一個(gè)activity去查看某項(xiàng)數(shù)據(jù)的具體內(nèi)容,代碼如下:

 
 
 
 
  1. private void handleIntent(Intentintent) { 
  2.  
  3. if(Intent.ACTION_SEARCH.equals(intent.getAction())) { 
  4.  
  5. String query =intent.getStringExtra(SearchManager.QUERY); 
  6.  
  7. doSearch(query); 
  8.  
  9. } else if(Intent.ACTION_VIEW.equals(intent.getAction())) { 
  10.  
  11. Uri detailUri =intent.getData(); 
  12.  
  13. String id = detailUri.getLastPathSegment(); 
  14.  
  15. Intent detailsIntent =new Intent(getApplicationContext(), DetailsActivity.class); 
  16.  
  17. detailsIntent.putExtra("ID", id); 
  18.  
  19. startActivity(detailsIntent); 
  20.  
  21. finish(); 
  22.  
  23.  

全局搜索

對(duì)于全局搜索的設(shè)置,只需要在配置文件中進(jìn)行如下設(shè)置:

android:includeInGlobalSearch="true"

但問(wèn)題是如何將你的APP應(yīng)用能放置到Android本身的搜索列表中去呢?如下圖:

你的APP應(yīng)用本身不能改變這些值,但Android提供了

android.app.SearchManager.INTENT_ACTION_GLOBAL_SEARCH

的方法,可以將你的APP應(yīng)用添加到搜索列表中去,這樣的話(huà),在搜索列表中,可以象如下圖的樣子進(jìn)行搜索:

關(guān)于搜索建議***的問(wèn)題

要注意的是關(guān)于搜索建議***的問(wèn)題,在于開(kāi)發(fā)者很難在樣式上進(jìn)行控制,這將會(huì)是一個(gè)很大的問(wèn)題。特別對(duì)于A(yíng)PP中如果搜索建議展示的樣式跟APP中其他的樣式很不同的話(huà),將會(huì)影響用戶(hù)體驗(yàn)。

另外,如果要在搜索建議中展示不同的數(shù)據(jù) ,有的時(shí)候也會(huì)變得麻煩。比如在一個(gè)關(guān)于音樂(lè)會(huì)的app應(yīng)用中,可能會(huì)出現(xiàn)位置和樂(lè)團(tuán)或樂(lè)隊(duì)的相關(guān)信息,開(kāi)發(fā)者企圖將它們?cè)谒阉鹘ㄗh中明確劃分開(kāi)來(lái),以方便用戶(hù)選擇,但可惜除非開(kāi)發(fā)者進(jìn)行自定義開(kāi)發(fā),否則無(wú)法實(shí)現(xiàn)這樣的功能。

小結(jié)

在本篇教程中,重點(diǎn)講解了如何在A(yíng)PP應(yīng)用中加入搜索建議的兩種方法和注意點(diǎn),在下一篇教程中,將講解如何使用搜索的快捷方式,敬請(qǐng)期待。

【譯稿,非經(jīng)授權(quán)謝絕轉(zhuǎn)載,合作媒體轉(zhuǎn)載請(qǐng)注明原文出處、作者及譯者!】


網(wǎng)頁(yè)題目:為Android應(yīng)用增加搜索功能:增加搜索建議
文章網(wǎng)址:http://m.5511xx.com/article/cojepcd.html