android源碼解析 ---- QuickSearchBox 搜索

該模塊說明: java

  每一次輸入框的內容發生改變時,都會進行搜索查詢,並顯示搜索建議。本模塊將字符串分別發送給搜索設置中的各個應用程序,由應用程序的provider在各自的模塊中進行查詢,將查詢結果返回給搜索模塊,而後搜索模塊將搜索建議顯示出來。 數據庫

  若是點擊查詢按鈕進行搜索,那麼此時就會跳轉到其餘的應用程序中,如短信息。那麼就由短信息模塊進行查找並將結果顯示在信息模塊的某個界面上。 網絡

  即,不管搜索建議仍是點擊搜索按鈕,其搜索的查詢功能均在各個模塊完成,由各個模塊在其本身定義的數據庫中進行查找,並提供結果,不一樣之處在於:搜索建議的結果要顯示在搜索模塊列表,搜索的結果要顯示在提供搜索的應用程序模塊。 ide

 

1.啓動界面Activity 函數

   點擊硬件搜索鍵或應用程序,啓動的第一個界面對應的類爲SearchActivity.java 佈局

   對應的佈局文件          R.layout.search_activity post

   左側應用程序選擇按鈕 mCorpusIndicator this

   搜索內容輸入框          mQueryTextView spa

   開始搜索按鈕             mSearchGoButton xml

   搜索建議內容顯示顯示列表  mSuggestionsView  

   搜索建議對應的填充內容     mSuggestionsAdapter

2.應用程序選擇對話框

   點擊mCorpusIndicator -> showCorpusSelectionDialog() ->createCorpusSelectionDialog()建立對話框

   CorpusSelectionDialog.java類即爲所顯示的對話框類

   對應佈局文件                R.layout.corpus_selection_dialog   

   對話框右上角設置按鈕    mEditItems

   填充的選項gridView      mCorpusGrid

   內容對應的adapter       onStart() -> CorporaAdapter adapter=CorporaAdapter.createGridAdapter(getViewFactory(),...)

   CorporaAdapter.java:對話框填充內容adapter

        new CorporaAdapter(...)  -> getView(...)生成整個佈局內容

        createView(...) -> mViewFactory.createGridCorpusView(parent)調用

   CorpusSelectionDialog.java中getViewFactory()->QsbApplication.java中getCorpusViewFactory()->createCorpusViewFactory

           ->new CorpusViewInflater(getContext())

   CorpusViewInflater.java中createGridCorpusView(...) 對應佈局R.layout.corpus_grid_item

   說明: CorporaAdapter.java中的mViewFactory對應的方法,在CorpusViewInflater.java中,其實現了CorpusViewFactory接口

   

  3. 搜索建議內容

     說明:當編輯textView時,即textView內容每次發生改變的時候,都會調用一次搜索功能,並將搜索建議所得的內容顯示在下面的listView中。其中,各模塊的搜索功能由各個模塊個字完成,而搜索模塊只是將各模塊的搜索結果顯示出來。

     代碼跟蹤:searchActivity.java中

     onCreate()-->mQueryTextView.addTextChangedListener(new SearchTextWatcher());

     SearchTextWatcher-->updateSuggestionsBuffered();

     updateSuggestionsBuffered-->mHandler.postDelayed(mUpdateSuggestionsTask, delay);
     mUpdateSuggestionsTask-->updateSuggestions(getQuery());
     updateSuggestions-->getSuggestionsProvider().getSuggestions(query, mCorpus, getMaxSuggestions());
     mSuggestionsAdapter.setSuggestions(suggestions);

     此處跟蹤尋找suggestions,即查找getSuggestionsProvider().getSuggestions(query, mCorpus, getMaxSuggestions())函數在哪裏調用的。

     searchActivity.java: getSuggestionsProvider-->getQsbApplication().getSuggestionsProvider();
     QsbApplication.java: getSuggestionsProvider-->mSuggestionsProvider = createSuggestionsProvider();
                                    provider = new SuggestionsProviderImpl(...)

     此provider即位獲取suggestions的provider。如今進入SuggestionsProviderImpl.java中,跟蹤其getSuggestions(...)函數。該函數中的QueryTask.startQueries(...)即位調用查找的關鍵語句。

 

如上分析意思:

      每次搜索輸入框內容發生改變時,會調用updateSuggestions(String query) {。。。}函數,更新列表內容。而對應搜索內容的查詢,在SuggestionsProviderImpl.java中的getSuggestions(...)函數中。

      SuggestionsAdapter.java爲搜索建議的adapter

      DefaultSuggestionView.java響應搜索建議的點擊事件

  4.搜索設置

     在彈出的選擇對話框中,點擊右上角的圖片,進入搜索設置界面。SearchableItemsSettings.java。

     一樣,在設置模塊中也有這樣一個入口。SearchSettings.java,corporaPreference響應進入搜索設置界面。

     其資源文件:R.xml.preferences_searchable_items

     此文件中動態加載響應搜索功能的模塊的CheckBoxPreference,當preference屬性發生改變時,會發送廣播

            SearchSettings.broadcastSettingsChanged(this);

     在CorporaUpdateReceiver.java中,更新搜索設置和小部件搜索列表

 

     檢索哪個狀態爲開啓或關閉狀態:

     在SearchableItemsSettings.java中,函數createCorpusPreference(...)中

      sourcePref.setDefaultValue(corpus.isCorpusDefaultEnabled());決定了該CheckBoxPreference處於打開仍是關閉狀態

     響應函數在AbstractCorpus.java中, isCorpusDefaultEnabled(){...}

     Config.java:isCorpusEnabledByDefault(...)

     系統出廠默認狀態爲網絡/聯繫人/應用程序,爲開啓狀態,在R.array.default_corpora中聲明,

       若想修改出廠默認選中項,修改default_corpora內容便可

     經過比較mDefaultCorpora.contains(corpusName)來返回boolean,便是否爲開啓狀態

  5.xml文件

     choice_activity.xml   搜索小部件的配置活動佈局

     corpus_indicator.xml  搜索框左側的選擇按鈕,默認爲所有

     corpus_list_item.xml     小部件配置活動中的ListView對應的佈局文件

     search_activity.xml      應用程序主界面

     corpus_selection_dialog.xml   搜索欄左側點擊,彈出的應用程序選擇對話框的佈局

     corpus_grid_item.xml   如上dialog,應用程序選擇對話框的內容的佈局

相關文章
相關標籤/搜索