(转)Android SearchView 搜索框
如果对这个效果感觉不错, 请往下看.
背景: 天气预报app, 本地数据库存储70个大中城市的基本信息, 根据用户输入的或通过搜索框选取的城市, 点击查询按钮后, 异步请求国家气象局数据, 得到返回的json解析并显示.
1. AndroidManifest.xml文件
- <uses-sdk
- android:minSdkVersion="11"
- android:targetSdkVersion="16" />
- <application>
- <activity
- android:name="com.lichen.weather.WeatherActivity"
- android:launchMode="singleTop"
- android:label="@string/app_name" >
- <intent-filter>
- <!-- 省略 -->
- </intent-filter>
- <!-- 关注1 -->
- <!-- Receives the search request. -->
- <intent-filter>
- <action android:name="android.intent.action.SEARCH" />
- <!-- No category needed, because the Intent will specify this class component-->
- </intent-filter>
- <!-- Points to searchable meta data. -->
- <meta-data android:name="android.app.searchable"
- android:resource="@xml/searchable" />
- <!-- /关注1 -->
- </activity>
- <provider android:name="com.lichen.db.CityContentProvider"
- android:authorities="com.lichen.cityprovider"
- android:label="@string/app_name"></provider>
- <!-- 关注2 -->
- <!-- Points to searchable activity so the whole app can invoke search. -->
- <meta-data android:name="android.app.default_searchable"
- android:value="com.lichen.weather.WeatherActivity" />
- <!-- /关注2 -->
- </application>
2. menu菜单
- <menu xmlns:android="http://schemas.android.com/apk/res/android" >
- <item android:id="@+id/search"
- android:title="@string/menu_search"
- android:showAsAction="collapseActionView|ifRoom"
- android:actionViewClass="android.widget.SearchView" />
- </menu>
3. 然后在res目录下新建xml/searchable.xml
- <?xml version="1.0" encoding="utf-8"?>
- <searchable xmlns:android="http://schemas.android.com/apk/res/android"
- android:label="@string/search_label"
- android:hint="@string/search_hint"
- android:searchSuggestAuthority="com.lichen.cityprovider"
- android:searchSuggestIntentAction="android.intent.action.VIEW"
- android:searchSuggestIntentData="content://com.lichen.cityprovider/city"
- android:searchSuggestSelection=" ?"
- android:searchSuggestThreshold="1"
- android:includeInGlobalSearch="true">
- </searchable>
字符串尽量使用@string/search_label这种方式.
4. Activity交互
因为注册Activity的启动方式为android:launchMode="singleTop",需要Activity的protected void onNewIntent(Intent intent) {}来交互.
- @Override
- protected void onNewIntent(Intent intent) {
- handleIntent(intent);
- }
- private void handleIntent(Intent intent) {
- if (Intent.ACTION_VIEW.equals(intent.getAction())) {
- //查询数据库
- Cursor searchCursor = getContentResolver().query(intent.getData(), null, null, null, null);
- if (searchCursor != null && searchCursor.moveToFirst()) {
- cityInput.setText(searchCursor.getString(searchCursor.getColumnIndex(City.CITY_DESCRIBE)));
- }
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.activity_weather, menu);
- SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
- SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
- searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
- searchView.setIconifiedByDefault(false);
- return true;
- }
以上的在网上可以搜索到,接下来是重点...
5. 数据库支持
- public class CityDatabaseHelper extends SQLiteOpenHelper {
- protected static final String DATABASE_NAME = "city.db";
- protected static final int DATABASE_VERSION = 6;
- public String[] columns = new String[] {
- SearchManager.SUGGEST_COLUMN_TEXT_1,
- SearchManager.SUGGEST_COLUMN_TEXT_2,
- SearchManager.SUGGEST_COLUMN_ICON_1,
- SearchManager.SUGGEST_COLUMN_ICON_2,
- BaseColumns._ID,
- SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID};
- private static final HashMap<String,String> mColumnMap = buildColumnMap();
- public CityDatabaseHelper(Context context) {
- super(context, DATABASE_NAME, null, DATABASE_VERSION);
- }
- private static HashMap<String,String> buildColumnMap() {
- HashMap<String,String> map = new HashMap<String,String>();
- map.put(SearchManager.SUGGEST_COLUMN_TEXT_1, City.CITY_DESCRIBE + " as "+SearchManager.SUGGEST_COLUMN_TEXT_1);
- map.put(SearchManager.SUGGEST_COLUMN_TEXT_2, City.CITY_NICKNAME + " as "+SearchManager.SUGGEST_COLUMN_TEXT_2);
- map.put(SearchManager.SUGGEST_COLUMN_ICON_1, City.CITY_IMG + " as "+SearchManager.SUGGEST_COLUMN_ICON_1);
- map.put(SearchManager.SUGGEST_COLUMN_ICON_2, City.CITY_IMG_2 + " as "+SearchManager.SUGGEST_COLUMN_ICON_2);
- map.put(BaseColumns._ID, "rowid AS " + BaseColumns._ID);
- map.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID, "rowid AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID);
- return map;
- }
- @Override
- public void onCreate(SQLiteDatabase db) {
- db.execSQL("create table "
- + City.TABLE_NAME
- + "(_id integer primary key autoincrement, city_id integer, city_name text, city_nickname text, city_describe text, city_img text, city_img_2 text)");
- }
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- db.execSQL("drop table if exists " + City.TABLE_NAME);
- onCreate(db);
- }
- /**
- * 用于ContentProvider调用,使用like的模糊查询
- */
- public Cursor search(String keyWord){
- SQLiteQueryBuilder builder=new SQLiteQueryBuilder();
- builder.setTables(City.TABLE_NAME);
- builder.setProjectionMap(mColumnMap);
- SQLiteDatabase db=getReadableDatabase();
- return builder.query(db, columns, City.CITY_NAME + " like ? " + " or " + City.CITY_NICKNAME +" like ? ", new String[]{"%"+keyWord+"%", "%"+keyWord+"%"}, null, null,null);
- }
- }
6. 完成searchable.xml里面注册的ContentProvider
- public class CityContentProvider extends ContentProvider {
- public static final String AUTHORITY = "com.lichen.cityprovider";
- private SQLiteDatabase db;
- private CityDatabaseHelper dbHelper;
- private static final int QUERY_NORMAL= 1;
- private static final int QUERY_BY_ID= 2;
- private static final int QUERY_SEARCH_CITY_NAME= 3;
- public static UriMatcher uriMatcher;
- static{
- uriMatcher=new UriMatcher(UriMatcher.NO_MATCH);
- uriMatcher.addURI(AUTHORITY,"city", QUERY_NORMAL);
- uriMatcher.addURI(AUTHORITY,"city/#", QUERY_BY_ID);
- uriMatcher.addURI(AUTHORITY,SearchManager.SUGGEST_URI_PATH_QUERY, QUERY_SEARCH_CITY_NAME);
- uriMatcher.addURI(AUTHORITY,SearchManager.SUGGEST_URI_PATH_QUERY + "/*", QUERY_SEARCH_CITY_NAME);
- }
- @Override
- public boolean onCreate() {
- dbHelper = new CityDatabaseHelper(getContext());
- return dbHelper != null;
- }
- @Override
- public Cursor query(Uri uri, String[] projection, String selection,
- String[] selectionArgs, String sortOrder) {
- db = dbHelper.getReadableDatabase();
- switch (uriMatcher.match(uri)) {
- case QUERY_SEARCH_CITY_NAME:
- return dbHelper.search(selectionArgs[0]);
- default:
- throw new IllegalArgumentException("Unknown Uri: " + uri);
- }
- }
- }
like模糊查询对于大数据量效果可想而知,FTS3的支持还未尝试,详情参考Android SDK里面的Samples/SearchableDictionary
转:http://blog.csdn.net/lc19850921/article/details/8887387
(转)Android SearchView 搜索框的更多相关文章
- 【Android自己定义View实战】之自己定义超简单SearchView搜索框
[Android自己定义View实战]之自己定义超简单SearchView搜索框 这篇文章是对之前文章的翻新,至于为什么我要又一次改动这篇文章?原因例如以下 1.有人举报我抄袭,原文链接:http:/ ...
- android浮动搜索框
android浮动搜索框的配置比较繁琐,需要配置好xml文件才能实现onSearchRequest()方法. 1.配置搜索的XML配置文件,新建文件searchable.xml,保存在res/xml ...
- Android 系统搜索框(有浏览记录)
实现Android 系统搜索框(有浏览记录),先看下效果: 一.配置搜索描述文件 要在res中的xml文件加创建sreachable.xml,内容如下: <?xml version=" ...
- Android的搜索框SearchView的用法-android学习之旅(三十九)
SearchView简介 SearchView是搜索框组件,他可以让用户搜索文字,然后显示.' 代码示例 这个示例加了衣蛾ListView用于为SearchView增加自动补全的功能. package ...
- Android actionbar 搜索框
就是实如今顶部这种搜索框. 一.这个搜索框是actionbar上的menu上的一个item.叫SearchView.我们能够先在menu选项里定义好: bmap_menu.xml: <?xml ...
- Android 浮动搜索框 searchable 使用(转)。
Android为程序的搜索功能提供了统一的搜索接口,search dialog和search widget,这里介绍search dialog使用.search dialog 只能为于activity ...
- Xamarin.Android 制作搜索框
前段时间仿QQ做了一个搜索框样式,个人认为还不错,留在这里给大家做个参考,希望能帮助到有需要的人. 首先上截图(图1:项目中的样式,图2:demo样式): 不多说直接上代码: Main.axml &l ...
- Android学习笔记_79_ Android 使用 搜索框
1.在资源文件夹下创建xml文件夹,并创建一个searchable.xml: android:searchSuggestAuthorityshux属性的值跟实现SearchRecentSuggesti ...
- Android开发 ---代码创建选项菜单、隐藏菜单项、菜单的生命周期,菜单按钮图标设置、搜索框、xml中设置子菜单
1.activity_main.xml 描述: 定义了一个按钮 <?xml version="1.0" encoding="utf-8"?> < ...
随机推荐
- Linq 综合写法
var queryCount = (from pv in db.Province join pc in (from cc in ((from v in db.ERPStockProdu ...
- BUG-jQuery提交表单submit方法-TypeError: e[h] is not a function
问题:button按钮设置id为submit后,表单jquery.submit()无法提交,报告异常TypeError: e[h] is not a function 源码: 解决:参考http:// ...
- Hive--关联表(join)
在hive中,关联有4种方式: 内关联:join on 左外关联:left join on 右外关联:right join on 全外关联:full join on 另外还有一种可实现hive笛卡儿积 ...
- QWT编译与配置-Windows/Linux环境
QWT编译与配置-Windows/Linux环境 QWT和FFTW两种开源组件是常用的工程软件支持组件,QWT可以提供丰富的绘图组件功能,FFTW是优秀数字波形分析软件.本文使用基于LGPL版权协议的 ...
- tomcat搭建https服务(非自签发)
平时做自己的web demo基本上都是用http协议进行访问. 但是正式情况基本上都是https进行访问,所以掌握https的配置是很关键的. 需要准备的材料: 一台可以可以外网访问的远程服务器 to ...
- typescript入门,可以一起探讨提点意见互相学习。
typescript是js的一个超集,TypeScript扩展了JavaScript的语法,所以任何现有的JavaScript程序可以不加改变的在TypeScript下工作.TypeScript是为大 ...
- 北京Uber优步司机奖励政策(11月9日~11月15日)
用户组:人民优步“关羽组”(适用于11月9日-11月15日)奖励政策: 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月 ...
- spark中数据倾斜解决方案
数据倾斜导致的致命后果: 1 数据倾斜直接会导致一种情况:OOM. 2 运行速度慢,特别慢,非常慢,极端的慢,不可接受的慢. 搞定数据倾斜需要: 1.搞定shuffle 2.搞定业务场景 3 搞定 c ...
- ajax跨域请求php
在众多站群中,不同功能的系统使用独立的一个域名,各系统之间存在相互调用的关系.使用js的XMLHttpRequest调用其他域名提示跨域权限不足.有些可能认为都同属于同一个顶级域名或者说域名一模一样怎 ...
- 网易云易盾与A10 Networks达成战略合作 携手打造抗DDoS攻击的解决方案
欢迎访问网易云社区,了解更多网易技术产品运营经验. 2018年9月,网易云易盾宣布,与智能和自动化网络安全解决方案提供商A10 Networks结成战略合作伙伴关系.双方将在抗DDoS攻击领域展开深入 ...