在使用ActionBarSherlock定义app的头部操作时,会经常看见搜索的动作,本文主要介绍一下搜索是如何实现的。

1. SearchView

是搜索的核心组件,具体介绍请参考Android官方说明文档:http://developer.android.com/reference/android/widget/SearchView.html

XML属性

属性名称

描述

android:iconifiedByDefault

设置SearchView的默认状态。

如果为true,在没有被使用和点击展开时它将被图形化。

android:maxWidth

SearchView的可选择的最大宽度

android:queryHint

当查询条件为空时显示的一个提示字符串。

重要的接口

名称 作用
interfaceSearchView.OnCloseListener 当用户关闭SearchView时触发的回调函数
interfaceSearchView.OnQueryTextListener 当查询文本改变时的回调函数。
interfaceSearchView.OnSuggestionListener 在建议上选择事件时的回调接口。

demo的核心代码

package com.hsx.wangcuo;import android.app.SearchManager;import android.database.Cursor;import android.database.MatrixCursor;import android.os.Bundle;import android.provider.BaseColumns;import android.view.LayoutInflater;import android.view.View;import com.actionbarsherlock.app.SherlockActivity;import com.actionbarsherlock.view.MenuItem;import com.actionbarsherlock.view.SubMenu;import com.actionbarsherlock.widget.SearchView;import com.hsx.wangcuo.adapter.QuerySuggestionsAdapter;import com.hsx.wangcuo.util.ToastUtil;public class MainActivity extends SherlockActivity implements SearchView.OnSuggestionListener, SearchView.OnQueryTextListener { private static final String[] COLUMNS = { BaseColumns._ID, SearchManager.SUGGEST_COLUMN_TEXT_1, }; private QuerySuggestionsAdapter mSuggestionsAdapter; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  initActionBarTitle(); } private void initActionBarTitle() {  // 可以自定义actionbar    getSupportActionBar().setDisplayShowCustomEnabled(true);  getSupportActionBar().setDisplayShowTitleEnabled(false);  // 不在actionbar显示logo    getSupportActionBar().setDisplayShowHomeEnabled(false);  View mainActionBarView = LayoutInflater.from(this).inflate(R.layout.main_action_bar, null);  getSupportActionBar().setCustomView(mainActionBarView); } @Override public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {  createSearchItem(menu);  /*************************************************/  MenuItem share = menu.add(0, 1, 2, "share");  share.setIcon(R.drawable.abs__ic_menu_share_holo_dark);  share.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);  /***************************************************/  SubMenu addMenu = menu.addSubMenu(0, 2, 3, "overflow");  addMenu.add(0, 3, 0, "更换主题");  addMenu.add(0, 4, 0, "系统设置");  addMenu.add(0, 5, 0, "修改密码");  addMenu.add(0, 6, 0, "更换头像");  MenuItem overFlowItem = addMenu.getItem();  overFlowItem.setIcon(R.drawable.abs__ic_menu_moreoverflow_holo_dark);  overFlowItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);  return super.onCreateOptionsMenu(menu); } /**   * Create the search view(搜索的核心代码)   *   * @param menu   * @return void   * @author hsx   * @time 2014-3-16下午03:48:01   */  private void createSearchItem(com.actionbarsherlock.view.Menu menu) {  SearchView searchView = new SearchView(getSupportActionBar().getThemedContext());  searchView.setQueryHint("Search for countries…");  searchView.setOnQueryTextListener(this);  searchView.setOnSuggestionListener(this);  if (mSuggestionsAdapter == null) {   MatrixCursor cursor = new MatrixCursor(COLUMNS);   cursor.addRow(new String[] { "1", "'Murica" });   cursor.addRow(new String[] { "2", "Canada" });   cursor.addRow(new String[] { "3", "Denmark" });   mSuggestionsAdapter = new QuerySuggestionsAdapter(getSupportActionBar().getThemedContext(), cursor);  }  searchView.setSuggestionsAdapter(mSuggestionsAdapter);  MenuItem searchItem = menu.add(0, 0, 0, "search");  searchItem.setIcon(R.drawable.abs__ic_search);  searchItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);  searchItem.setActionView(searchView); } @Override public boolean onOptionsItemSelected(MenuItem item) {  switch (item.getItemId()) {  case 1:   ToastUtil.showShortToast(MainActivity.this, "分享");   break;  case 3:   ToastUtil.showShortToast(MainActivity.this, "更换主题");   break;  case 4:   ToastUtil.showShortToast(MainActivity.this, "系统设置");   break;  case 5:   ToastUtil.showShortToast(MainActivity.this, "修改密码");   break;  case 6:   ToastUtil.showShortToast(MainActivity.this, "更换头像");   break;  }  return super.onOptionsItemSelected(item); } /***   * implements SearchView.OnQueryTextListener   */ @Override public boolean onQueryTextSubmit(String query) {  ToastUtil.showShortToast(this, "You searched for: " + query);  return true; } /***   * implements SearchView.OnQueryTextListener   */ @Override public boolean onQueryTextChange(String newText) {  return false; } /**   * implements SearchView.OnSuggestionListener   */ @Override public boolean onSuggestionSelect(int position) {  return false; } /**   * implements SearchView.OnSuggestionListener   */ @Override public boolean onSuggestionClick(int position) {  Cursor c = (Cursor) mSuggestionsAdapter.getItem(position);  String query = c.getString(c.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1));  ToastUtil.showShortToast(this, "Suggestion clicked: " + query);  return true; }}

/*******************************************************************************************************************************/

QuerySuggestionsAdapter

package com.hsx.wangcuo.adapter;import android.app.SearchManager;import android.content.Context;import android.database.Cursor;import android.support.v4.widget.CursorAdapter;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;public class QuerySuggestionsAdapter extends CursorAdapter { public QuerySuggestionsAdapter(Context context, Cursor c) {  super(context, c, 0); } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) {  LayoutInflater inflater = LayoutInflater.from(context);  View v = inflater.inflate(android.R.layout.simple_list_item_1, parent, false);  return v; } @Override public void bindView(View view, Context context, Cursor cursor) {  TextView tv = (TextView) view;  final int textIndex = cursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1);  tv.setText(cursor.getString(textIndex)); }}

效果图如下:

ActionBarSherlock中的搜索及SearchView的使用 ..._第1张图片

还有一个小的bug,没有找到解决方法:输入一个字母的时候,不弹出提示

ActionBarSherlock中的搜索及SearchView的使用 ..._第2张图片

demo的地址 :http://download.csdn.net/detail/abc13939746593/7061035

更多相关文章

  1. Android 短信模块分析(二) MMS中四大组件核心功能详解
  2. Adroid核心分析
  3. Android Chronometer控件实现计时器函数详解
  4. [置顶] Android 4.2 Wifi Display核心分析 (一)
  5. Android下使用dlopen函数动态调用.so链接库
  6. Android核心分析---Android电话系统
  7. 《Qt on Android核心编程》相关资源
  8. Android Activity的onCreate()函数

随机推荐

  1. 在jQuery中使用css transform属性
  2. 根据用户时区显示当地时间 php+javascrip
  3. 从两个数组生成JSON
  4. 使用谷歌地图computeDistanceBetween获取
  5. ajax请求中URL和参数的编码问题
  6. 在KENDO UI Multiselect中选择默认值
  7. 在jQuery datetimepicker中禁用特定时间
  8. 桌面视图中的SlikNav多级菜单?
  9. 显示json数组中的所有项目
  10. 图表。js数据数组使用PHP, MySQL。如何从