相比于直接在布局文件中添加SearchView控件,让SeachView以菜单项的形式体现出来比较复杂,具体步骤如下
- 在菜单布局文件中定义搜索项
最后一项属性非常重要<item android:id="@+id/menu_search" android:orderInCategory="1" app:showAsAction="always" android:title="@string/search_title" app:actionViewClass="android.support.v7.widget.SearchView" />
- 在res\xml文件中新建文件searchable.xml,设置搜索框的样式代码
!!!注意:其中的标签和提示必须写字符串资源中的id,不能直接写字符串,如果直接写字符串,在后面可能会出现问题 实测<?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" android:inputType="text" android:searchButtonText="@string/search" > </searchable>
- 在AndroidManifest.xml文件中加入搜索结果activity节点定义,并指定action和meta-data
<activity android:name=".NewsSearchAcitivity"> <intent-filter> <action android:name="android.intent.action.SEARCH"/> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/> </activity>
- 在搜索框所在的activity代码中初始化搜索框,并关联搜索动作对应的结果Activity
private void initSearchView(Menu menu){ //获取menu中搜索item的单个实例 MenuItem menuItem = menu.findItem(R.id.menu_search); //获取搜索item的View 并把它转为SearchView SearchView searchView = (SearchView) MenuItemCompat.getActionView(menuItem); //在布局文件中添加控件的获取方式 //SearchView searchView = (SearchView) findViewById(R.id.search_view); if(searchView == null){ Log.d(TAG, "fail to get SearchView"); }else { if(getIntent() != null){ //设置是否将搜索视图默认折叠为图标,当前不设置 searchView.setIconifiedByDefault(getIntent().getBooleanExtra("collapse",false)); }else { searchView.setIconifiedByDefault(false); } //设置是否启用完成图标,当前设置 searchView.setSubmitButtonEnabled(true); //得到搜索管理器实例 SearchManager manager = (SearchManager) getSystemService(SEARCH_SERVICE); //可以根据组件启动搜索结果活动 ComponentName name = new ComponentName(this,NewsSearchAcitivity.class); //检查搜索结果活动是否可到达 SearchableInfo info = manager.getSearchableInfo(name); if(info == null){ Log.d(TAG, "fail to get result"); } //设置搜索动作的定义 searchView.setSearchableInfo(info); //系统id,不需要到布局文件中定义,当初不懂这个id走了很多弯路 private SearchView.SearchAutoComplete sac_key; sac_key = searchView.findViewById(R.id.search_src_text); sac_key.setTextColor(Color.BLACK); sac_key.setHintTextColor(Color.BLACK); } }
- 调用以上方法
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.tab_first_menu,menu); initSearchView(menu);//再次调用方法 return true; }
- 搜索结果的获取
Intent intent = getIntent(); if(intent != null && intent.getAction().equals(Intent.ACTION_SEARCH)){ String ori_kw = intent.getStringExtra(SearchManager.QUERY);