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));
  }
}

效果图如下:

device-2014-03-18-164601

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

device-2014-03-18-164645

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值