ActionBarSherlock的学习笔记(四) ------------ 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));
}
}
效果图如下:

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

demo的地址 : http://download.csdn.net/detail/abc13939746593/7061035
ActionBarSherlock的学习笔记(四) ------------ ActionBarSherlock中的搜索及SearchView的使用的更多相关文章
- Typescript 学习笔记四:回忆ES5 中的类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
- IOS学习笔记(四)之UITextField和UITextView控件学习
IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...
- java之jvm学习笔记四(安全管理器)
java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...
- ES6学习笔记<四> default、rest、Multi-line Strings
default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...
- muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制
目录 muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制 eventfd的使用 eventfd系统函数 使用示例 EventLoop对eventfd的封装 工作时序 runInLoo ...
- python3.4学习笔记(四) 3.x和2.x的区别,持续更新
python3.4学习笔记(四) 3.x和2.x的区别 在2.x中:print html,3.x中必须改成:print(html) import urllib2ImportError: No modu ...
- 零拷贝详解 Java NIO学习笔记四(零拷贝详解)
转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...
- Linux学习笔记(四) vi编辑器
一.vi 编辑器 vi 编辑器 (Visual Interface) 是所有 Unix 及 Linux 系统下标准的编辑器,相当于 Windows 系统中的记事本 它有三种模式,分别是: Comman ...
- MySql学习笔记四
MySql学习笔记四 5.3.数据类型 数值型 整型 小数 定点数 浮点数 字符型 较短的文本:char, varchar 较长的文本:text, blob(较长的二进制数据) 日期型 原则:所选择类 ...
随机推荐
- 01-06-01【Nhibernate (版本3.3.1.4000) 出入江湖】事务
Nhibernate事务的使用: public void Add(Customer customer) { ISession session = _sessionManager.GetSession( ...
- rsync 文件校验及同步原理及rsync server配置
参考:http://rsync.samba.org/how-rsync-works.html 我们关注的是其发送与接收校验文件的算法,这里附上原文和我老婆(^_^)的翻译: The Sender Th ...
- winform Chart控件 获取鼠标处坐标值方法
Chart控件本身功能强大,应用广泛,因此其属性.方法也很多.此处介绍在很多应用中需要查看鼠标位置处坐标值的一些方法 1,调用Chart事件 GetToolTip 利用ToolTipEventArg ...
- 【redis】05Redis的常用命令及高级应用
Redis常用命令 Redis提供了非常丰富的命令,对数据库和个中数据类型进行操作, 这些命令呢,可以在Linux终端使用. 分为两大类的命令,一种是键值相关的命令,一种是服务器相关的命令, ...
- Javascript 电子时钟源码
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- ***常见复杂SQL语句(含统计类SQL)
1.SQL统计某字段的出现次数 比如统计某个表中,姓名出现的次数:select name,count(*) from biao group by name having count(*) > 2 ...
- intellij idea 12、13 win8 下 中文输入覆盖的问题(搜狗输入法或者其他输入法)
最近升级到idea12,发现中文输入存在问题,输入中文的时候会出现空格,并且覆盖后面的字符,这个问题让我很郁闷. 假设idea的安装位置为:D:\Program Files\JetBrains\Int ...
- java:synchronized
synchronized:利用上锁实现数据同步,避免多线程操作的情况下,数据出现异常. 另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块. 一个线程获得了一个对象的同步锁,那这个对象上所 ...
- Spring 操作数据库
试了一下spring的JdbcTemplate觉得很好用.首先增加一个连接到mysql数据库的dataSource <bean id="dataSource2" class= ...
- 如何手动把jar包添加进Maven本地仓库
有以下两种情况你需要手动通过Maven命令把jar文件添加进本地仓库: 1.在中心仓库里没有你想要的jar包. 2.你自己写了一个jar包,在其他项目要用到. 补充:现在仍有很多jar包不支持Mave ...