Android actionbar 搜尋方塊

來源:互聯網
上載者:User

標籤: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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.