ActionBarSherlock中的搜索及SearchView的使用 ...

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

1. SearchView 

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

XML 属性

属性名称

描述

android:iconifiedByDefault

设置SearchView的默认状态。

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

android:maxWidth

SearchView的可选择的最大宽度

android:queryHint

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

重要的接口

名称 作用
interface          SearchView.OnCloseListener 当用户关闭SearchView时触发的回调函数
interface          SearchView.OnQueryTextListener        当查询文本改变时的回调函数。
interface          SearchView.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

你可能感兴趣的:(ActionBarSherlock中的搜索及SearchView的使用 ...)