標籤:android style blog class code java
就是實現在頂部這樣的搜尋方塊。
一、這個搜尋方塊是actionbar上的menu上的一個item.叫SearchView.我們可以先在menu選項裡定義好:
bmap_menu.xml:
<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/menu_search" android:icon="@android:drawable/ic_menu_search" android:title="@string/action_search" android:actionViewClass="android.widget.SearchView" android:showAsAction="ifRoom|collapseActionView" /></menu>
這裡showAsAction的collapseActionView 表示允許將searchView擴充到整個actionbar.
二、配置searchble:
Search View 可以看作seachble activity在acionbar 的一種快捷入口的標識。那麼我們可以通過配置searchble 配置相關的資訊:
在res/xml檔案夾下(如果沒有xml檔案夾,就建立一個),建立檔案:searchable.xml
<?xml version="1.0" encoding="utf-8"?><searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/search_label" android:hint="@string/search_hint"/>
三、配置AndroidManifest.xml
既然searchview是一個入口標識,那麼久需要在AndroidManifest.xml檔案裡配置過濾:
<activity android:name="cn.com.smartcost.cld.ui.BmapActivity" > <intent-filter> <action android:name="android.intent.action.SEARCH"/> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/></activity>
四、searchView 載入searchble 配置資訊 :
public boolean onCreateOptionsMenu(Menu menu) { // 加入含有search view的菜單 MenuInflater inflater = getMenuInflater(); inflater.inflate(menuId, menu); // 擷取SearchView對象 SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); if(searchView == null){ Log.e("SearchView","Fail to get Search View."); return true; } searchView.setIconifiedByDefault(true); // 預設值就是true,可能不專門進行設定,false和true的如下,true的輸入框更大 // 擷取搜尋服務管理員 SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); // searchable activity的component name,由此系統可通過intent進行喚起 ComponentName cn = new ComponentName(this,SearchResultActvity.class); // 通過搜尋管理器,從searchable activity中擷取相關搜尋資訊,就是searchable的xml設定。如果返回null,表示該activity不存在,或者不是searchable SearchableInfo info = searchManager.getSearchableInfo(cn); if(info == null){ Log.e("SearchableInfo",Fail to get search info."); } // 將searchable activity的搜尋資訊與search view關聯 searchView.setSearchableInfo(info); return true; }
五、響應搜尋的activity:
public class BmapActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { … … doSearchQuery(getIntent()); } @Override protected void onNewIntent(Intent intent) { //activity重新置頂 super.onNewIntent(intent); doSearchQuery(intent); } // 對searchable activity的調用仍是標準的intent,我們可以從intent中擷取資訊,即要搜尋的內容 private void doSearchQuery(Intent intent){ if(intent == null) return; String queryAction = intent.getAction(); if( Intent.ACTION_SEARCH.equals( intent.getAction())){ //如果是通過ACTION_SEARCH來調用,即如果通過搜尋調用 String queryString = intent.getStringExtra(SearchManager.QUERY); //擷取搜尋內容 … … } } … … }
另外,有幾個需求:
1.如何改變預設搜尋方塊底下的那條橫線的顏色,這個看似容易,其實很麻煩,如果直接設定背景圖片的話,很可能會造成疊加的情況。網上看了overflow論壇的人的方法,覺得都不太理想,有人提出 用反射的方法解決,我也是採用反射的辦法:
try{Class<?> argClass=searchView.getClass(); Field ownField = argClass.getDeclaredField("mSearchPlate"); //setAccessible ownField.setAccessible(true); View mView = (View) ownField.get(searchView); mView.setBackground(getResources().getDrawable(R.drawable.test)); }catch(Exception e){e.printStackTrace();}
但是這樣的有一個問題,假如你的searchView有一個submit的話,那麼僅僅是搜尋方塊底下的那條橫線變色了,而submit下的顏色仍然為藍色。目前我也找不到submit這個成員變數名叫什麼。不知道各位有什麼好的辦法。
2.預設展開searchView:
很多人都有這個需求,想預設吧searchView展開,再加點預設文字在上面(不是hint).
這個使用這個展開:
MenuItem searchItem = menu.findItem(R.id.menu_search);searchItem.expandActionView();
這樣設定文字:
searchView.setQuery("ok", false);
如果僅僅這樣會吧虛擬鍵盤也開啟,影響體驗,關閉虛擬鍵盤的方法是使searView清除焦點:
searchView.clearFocus();
參考:
Google開發文檔:http://developer.android.com/training/search/setup.html
愷風的部落格 http://blog.csdn.net/flowingflying/article/details/14163401