Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android actionbar 搜索框

Android actionbar 搜索框

編輯:關於Android編程

\

就是實現在頂部這樣的搜索框。

一、這個搜索框是actionbar上的menu上的一個item.叫SearchView.我們可以先在menu選項裡定義好:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+Ym1hcF9tZW51LnhtbDo8L3A+CjxwPjwvcD4KPHByZSBjbGFzcz0="brush:java;">


這裡showAsAction的collapseActionView 表示允許將searchView擴展到整個actionbar.

二、配置searchble:

Search View 可以看作seachble activity在acionbar 的一種快捷入口的標識。那麼我們可以通過配置searchble 配置相關的信息:

在res/xml文件夾下(如果沒有xml文件夾,就新建一個),新建文件:searchable.xml



三、配置AndroidManifest.xml

既然searchview是一個入口標識,那麼久需要在AndroidManifest.xml文件裡配置過濾:

  
           
                

             
          
          
 

四、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();

參考:

谷歌開發文檔:http://developer.android.com/training/search/setup.html

恺風的博客 http://blog.csdn.net/flowingflying/article/details/14163401

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