Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android---浮動搜索框(SearchManager)

Android---浮動搜索框(SearchManager)

編輯:Android開發實例

浮動搜索框的使用其實並不難,而是在於它的配置非常之繁瑣,對於它的使用主要是方便開發者對於程序中有搜索業務時,更好的設計UI

SearchManager具體使用步驟如下:

(1)配置search bar的相關信息,新建一個位於res/xml下的一個searchable.xml的配置文件,如默認值、是否有搜索建議或者語音搜索。

 
<searchable xmlns:android=http://schemas.android.com/apk/res/android   <!-- label為搜索框上方的文本,hint搜索框裡面的提示文本,顯示label -->
android:label="@string/search_label"
android:hint="@string/search_hint"
android:searchMode="showSearchLabelAsBadge"
  <!-- 語音搜索配置 -->
android:voiceSearchMode="showVoiceSearchButton|launchRecognizer"
android:voiceLanguageModel="free_form"
android:voicePromptText="@string/search_invoke"  <!-- 配置搜索建議,配置錯誤將不會顯示,這裡的searchSuggestAuthority的值必須是 繼承自SearchRecentSuggestionsProvider的完整路徑名 -->    android:searchSuggestAuthority="com.android.cbin.SearchSuggestionSampleProvider"
android:searchSuggestSelection=" ? "
/>

(2) manifest.xml配置,搜索結果處理的Activity將出現兩種情況,一種是從其他Activity中的search bar打開一個Activtiy

專門處理搜索結果,第二種是就在當前Activity就是處理結果的Activity,先介紹第一種配置:

 
    <activity android:name="SearchResultActivity">

<intent-filter>
<action android:name="android.intent.action.SEARCH"></action>
</intent-filter>           <!-- 指定上面的searchable.xml文件 -->    <meta-data android:resource="@xml/searchable"          android:name="android.app.searchable"></meta-data>

</activity>

 

 
<!-- 為了使每一個Activity都能使用search bar,一定要將這個標簽放到啟動Activity中,裡面的value指定
 的是前面的搜索結果Activity-->
 <meta-data android:name="android.app.default_searchable"
android:value=".SearchResultActivity" />

(3)搜索建議在manifest.xml中相關的配置

<!--之前searchable.xml中有一個searchSuggestAuthority的值其實和這裡的authorities指向的都是name中所關聯的SearchSuggestionSampleProvider,他是一個SearchRecentSuggestionsProvider的子類--> <provider android:name="SearchSuggestionSampleProvider"  android:authorities="com.android.cbin.SearchSuggestionSampleProvider"></provider>

(4)為了能夠使用search bar 我們必須重寫Activity的onSearchRequested的方法,在界面上啟動一個search bar

但是這個動作不會自動觸發,必須通過一個按鈕或者菜單的點擊事件觸發;

 
    @Override
public boolean onSearchRequested(){

String text=etdata.getText().toString();
Bundle bundle=new Bundle();
bundle.putString("data", text);

//打開浮動搜索框(第一個參數默認添加到搜索框的值)
//bundle為傳遞的數據
startSearch("mm", false, bundle, false);
//這個地方一定要返回真 如果只是super.onSearchRequested方法不但     //onSearchRequested(搜索框默認值)無法添加到搜索框中,bundle也無法傳遞出去
return true;
}

(5)接收query和bundle、保存query值(即搜索建議的列表值)

 
    public void doSearchQuery(){
final Intent intent = getIntent();
//獲得搜索框裡值
String query=intent.getStringExtra(SearchManager.QUERY);
tvquery.setText(query);
//保存搜索記錄
SearchRecentSuggestions suggestions=new SearchRecentSuggestions(this,
SearchSuggestionSampleProvider.AUTHORITY, SearchSuggestionSampleProvider.MODE);
suggestions.saveRecentQuery(query, null);
if(Intent.ACTION_SEARCH.equals(intent.getAction())){
//獲取傳遞的數據
Bundle bundled=intent.getBundleExtra(SearchManager.APP_DATA);
if(bundled!=null){
String ttdata=bundled.getString("data");
tvdata.setText(ttdata);

}else{
tvdata.setText("no data");
}
}
}

 之前說到了處理結果的Activity將可能出現的兩種情況的兩種,現在就處理第二種狀況,就是假如invoke search bar的

Activity同時也是處理搜索結果的Activity,如果按照之前的方式處理則會出現一種情況,搜索一次就實例化一次Activity,當按返回

鍵的時候會發現老是同一個Activity,其實為了使它只有一個實例化對象,只需簡單的配置和代碼就能實現

第一:在處理搜索結果Activity的manifest.xml中添加android:launchMode="singleTop"屬性

第二:重寫Activity的onNewIntent(Intent intent)

 
    @Override
public void onNewIntent(Intent intent){
super.onNewIntent(intent);
//獲得搜索框裡值
String query=intent.getStringExtra(SearchManager.QUERY);
tvquery.setText(query);
//保存搜索記錄
SearchRecentSuggestions suggestions=new SearchRecentSuggestions(this,
SearchSuggestionSampleProvider.AUTHORITY, SearchSuggestionSampleProvider.MODE);
suggestions.saveRecentQuery(query, null);
if(Intent.ACTION_SEARCH.equals(intent.getAction())){
//獲取傳遞的數據
Bundle bundled=intent.getBundleExtra(SearchManager.APP_DATA);
if(bundled!=null){
String ttdata=bundled.getString("data");
tvdata.setText(ttdata);

}else{
tvdata.setText("no data");
}
}
}

相關知識:上面講到了將最近的搜索值添加到搜索建議中,但卻沒有提到如果清理搜索建議中的值,與保存相似,SearchRecentSuggestion對象提供了一個clearHistory()方法

 

    private void clearSearchHistory() {
SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
SearchSuggestionSampleProvider.AUTHORITY, SearchSuggestionSampleProvider.MODE);
suggestions.clearHistory();
}

忘了上效果圖:oye

轉自:http://www.cnblogs.com/jico/archive/2010/11/05/1869814.html

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved