就是实现在顶部这样的搜索框。
一、这个搜索框是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();
参考:
谷歌开发文档:http://developer.android.com/training/search/setup.html
恺风的博客 http://blog.csdn.net/flowingflying/article/details/14163401