介绍两种SearchView的使用方式:
1.在ActionBar上使用SearchView 2.在布局页面上使用SearchView
#在ActionBar上使用SearchView
1.在ActionBar的配置文件:
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/search" android:title="@string/search" android:icon="@drawable/ic_menu_search" android:showAsAction="collapseActionView|ifRoom" android:actionViewClass="android.widget.SearchView" /> </menu>
2.重写onCreateOptionsMenu():
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.options_menu, menu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); // 获取ActionBar上的SearchView // 这里需要用到SearchView的布局文件 // 用MenuItem的getActionView()方法获取android:actionViewClass所对应的实例 // 这里是android.widget.SearchView SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView(); searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); searchView.setSubmitButtonEnabled(true);// 是否显示确认搜索按钮 // 设置展开后图标的样式,这里只有两种,一种图标在搜索框外,一种在搜索框内 searchView.setIconifiedByDefault(false); searchView.setIconified(false);// 设置 searchView.clearFocus();// 清除焦点 /* * 这里是重点,SearchView并没有提供样式的修改方法,所以只能 * 1.用获取到的实例调用getContext()方法,返回当前view的上下文 * 2.调用getResources()方法,获取该view的资源实例(Return a Resources instance) * 3.调用getIdentifier()方法,获取相同名字的ID,(Return a resource identifier for the * given resource name) 4.通过findViewById()获取该ID的实例,然后就可以做相应的操作了 */ int search_mag_icon_id = searchView.getContext().getResources() .getIdentifier("android:id/search_mag_icon", null, null); ImageView search_mag_icon = (ImageView) searchView.findViewById(search_mag_icon_id);// 获取搜索图标 search_mag_icon.setImageResource(R.drawable.ic_menu_search);// 图标都是用src的 // 设置提示文字的颜色,这里走了点奇招,用Html类方法 searchView.setQueryHint(Html.fromHtml("<font color = #FA646C>" + getResources().getString(R.string.search_hint) + "</font>")); searchView.setOnQueryTextListener(new OnQueryTextListener() { // 监听键盘点击确认按钮 @Override public boolean onQueryTextSubmit(String query) { Toast.makeText(MainActivity.this, "submit text:" + query, Toast.LENGTH_SHORT).show(); // 启动对应activity并将输入框文本传入 Intent intent = new Intent(); intent.setAction(Intent.ACTION_SEARCH); intent.setClass(MainActivity.this, SearchActivity.class); intent.putExtra(SearchManager.QUERY, query); startActivity(intent); return true; } // 监听输入框文本变化 @Override public boolean onQueryTextChange(String newText) { Toast.makeText(MainActivity.this, "text change" + newText, Toast.LENGTH_SHORT).show(); return true; } }); // 如果希望SearchView一直处理展开状态,可以实现它的OnCloseListener方法 // 返回true,截取关闭事件,不让搜索框收起来 searchView.setOnCloseListener(new OnCloseListener() { @Override public boolean onClose() { return true; } }); return true; }
3.新建SearchView响应Activity:
AndroidManifest.xml文件中的配置:
<activity android:name=".SearchActivity" > <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> </activity>
4.搜索响应Activity:SearchActivity:
public class SearchActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); handleIntent(getIntent()); } @Override protected void onNewIntent(Intent intent) { handleIntent(intent); } private void handleIntent(Intent intent) { if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String query = intent.getStringExtra(SearchManager.QUERY); // use the query to search your data somehow Toast.makeText(this, "search text is " + query, Toast.LENGTH_SHORT).show(); } } }
#在布局页面上使用SearchView:
1.Layout配置文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.actionbardemo2.SearchViewInLayoutActivity" > <SearchView android:id="@+id/search_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:iconifiedByDefault="true" android:imeOptions="actionSearch" android:inputType="textCapWords" android:queryHint="input text" /> </RelativeLayout>
2.Activity:
public class SearchViewInLayoutActivity extends Activity { SearchView sv = null; ListView lv = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_search_view_in_layout); sv = (SearchView) this.findViewById(R.id.search_view); sv.setIconifiedByDefault(false); sv.setSubmitButtonEnabled(true); sv.setQueryHint("查询"); String[] columnNames = { "_id", "text" }; MatrixCursor cursor = new MatrixCursor(columnNames); String[] array = { "cc", "ll", "hh" }; String[] temp = new String[2]; int id = 0; for (String item : array) { temp[0] = Integer.toString(id++); temp[1] = item; cursor.addRow(temp); } String[] from = { "text" }; int[] to = { R.id.textView1 }; SimpleCursorAdapter adapter = new SimpleCursorAdapter(SearchViewInLayoutActivity.this, R.layout.search_view_suggestion_text, cursor, from, to, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); sv.setSuggestionsAdapter(adapter); sv.setOnQueryTextListener(new OnQueryTextListener() { @Override public boolean onQueryTextChange(String str) { Toast.makeText(SearchViewInLayoutActivity.this, str, Toast.LENGTH_SHORT).show(); return true; } @Override public boolean onQueryTextSubmit(String str) { Toast.makeText(SearchViewInLayoutActivity.this, str, Toast.LENGTH_SHORT).show(); return true; } }); } }
重用上例的响应activity。