如果对这个效果感觉不错, 请往下看.

背景: 天气预报app, 本地数据库存储70个大中城市的基本信息, 根据用户输入的或通过搜索框选取的城市, 点击查询按钮后, 异步请求国家气象局数据, 得到返回的json解析并显示.

1. AndroidManifest.xml文件

  1. <uses-sdk
  2. android:minSdkVersion="11"
  3. android:targetSdkVersion="16" />
  4. <application>
  5. <activity
  6. android:name="com.lichen.weather.WeatherActivity"
  7. android:launchMode="singleTop"
  8. android:label="@string/app_name" >
  9. <intent-filter>
  10. <!-- 省略 -->
  11. </intent-filter>
  12. <!-- 关注1 -->
  13. <!-- Receives the search request. -->
  14. <intent-filter>
  15. <action android:name="android.intent.action.SEARCH" />
  16. <!-- No category needed, because the Intent will specify this class component-->
  17. </intent-filter>
  18. <!-- Points to searchable meta data. -->
  19. <meta-data android:name="android.app.searchable"
  20. android:resource="@xml/searchable" />
  21. <!-- /关注1 -->
  22. </activity>
  23. <provider android:name="com.lichen.db.CityContentProvider"
  24. android:authorities="com.lichen.cityprovider"
  25. android:label="@string/app_name"></provider>
  26. <!-- 关注2 -->
  27. <!-- Points to searchable activity so the whole app can invoke search. -->
  28. <meta-data android:name="android.app.default_searchable"
  29. android:value="com.lichen.weather.WeatherActivity" />
  30. <!-- /关注2 -->
  31. </application>

2. menu菜单

  1. <menu xmlns:android="http://schemas.android.com/apk/res/android" >
  2. <item android:id="@+id/search"
  3. android:title="@string/menu_search"
  4. android:showAsAction="collapseActionView|ifRoom"
  5. android:actionViewClass="android.widget.SearchView" />
  6. </menu>

3. 然后在res目录下新建xml/searchable.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <searchable xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:label="@string/search_label"
  4. android:hint="@string/search_hint"
  5. android:searchSuggestAuthority="com.lichen.cityprovider"
  6. android:searchSuggestIntentAction="android.intent.action.VIEW"
  7. android:searchSuggestIntentData="content://com.lichen.cityprovider/city"
  8. android:searchSuggestSelection=" ?"
  9. android:searchSuggestThreshold="1"
  10. android:includeInGlobalSearch="true">
  11. </searchable>

字符串尽量使用@string/search_label这种方式.

4. Activity交互

因为注册Activity的启动方式为android:launchMode="singleTop",需要Activity的protected void onNewIntent(Intent intent) {}来交互.

  1. @Override
  2. protected void onNewIntent(Intent intent) {
  3. handleIntent(intent);
  4. }
  5. private void handleIntent(Intent intent) {
  6. if (Intent.ACTION_VIEW.equals(intent.getAction())) {
  7. //查询数据库
  8. Cursor searchCursor = getContentResolver().query(intent.getData(), null, null, null, null);
  9. if (searchCursor != null && searchCursor.moveToFirst()) {
  10. cityInput.setText(searchCursor.getString(searchCursor.getColumnIndex(City.CITY_DESCRIBE)));
  11. }
  12. }
  13. @Override
  14. public boolean onCreateOptionsMenu(Menu menu) {
  15. getMenuInflater().inflate(R.menu.activity_weather, menu);
  16. SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
  17. SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
  18. searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
  19. searchView.setIconifiedByDefault(false);
  20. return true;
  21. }

以上的在网上可以搜索到,接下来是重点...

5. 数据库支持

  1. public class CityDatabaseHelper extends SQLiteOpenHelper {
  2. protected static final String DATABASE_NAME = "city.db";
  3. protected static final int DATABASE_VERSION = 6;
  4. public  String[] columns = new String[] {
  5. SearchManager.SUGGEST_COLUMN_TEXT_1,
  6. SearchManager.SUGGEST_COLUMN_TEXT_2,
  7. SearchManager.SUGGEST_COLUMN_ICON_1,
  8. SearchManager.SUGGEST_COLUMN_ICON_2,
  9. BaseColumns._ID,
  10. SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID};
  11. private static final HashMap<String,String> mColumnMap = buildColumnMap();
  12. public CityDatabaseHelper(Context context) {
  13. super(context, DATABASE_NAME, null, DATABASE_VERSION);
  14. }
  15. private static HashMap<String,String> buildColumnMap() {
  16. HashMap<String,String> map = new HashMap<String,String>();
  17. map.put(SearchManager.SUGGEST_COLUMN_TEXT_1, City.CITY_DESCRIBE + " as "+SearchManager.SUGGEST_COLUMN_TEXT_1);
  18. map.put(SearchManager.SUGGEST_COLUMN_TEXT_2, City.CITY_NICKNAME + " as "+SearchManager.SUGGEST_COLUMN_TEXT_2);
  19. map.put(SearchManager.SUGGEST_COLUMN_ICON_1, City.CITY_IMG + " as "+SearchManager.SUGGEST_COLUMN_ICON_1);
  20. map.put(SearchManager.SUGGEST_COLUMN_ICON_2, City.CITY_IMG_2 + " as "+SearchManager.SUGGEST_COLUMN_ICON_2);
  21. map.put(BaseColumns._ID, "rowid AS " + BaseColumns._ID);
  22. map.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID, "rowid AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID);
  23. return map;
  24. }
  25. @Override
  26. public void onCreate(SQLiteDatabase db) {
  27. db.execSQL("create table "
  28. + City.TABLE_NAME
  29. + "(_id integer primary key autoincrement, city_id integer, city_name text, city_nickname text, city_describe text, city_img text, city_img_2 text)");
  30. }
  31. @Override
  32. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  33. db.execSQL("drop table if exists " + City.TABLE_NAME);
  34. onCreate(db);
  35. }
  36. /**
  37. * 用于ContentProvider调用,使用like的模糊查询
  38. */
  39. public Cursor search(String keyWord){
  40. SQLiteQueryBuilder builder=new SQLiteQueryBuilder();
  41. builder.setTables(City.TABLE_NAME);
  42. builder.setProjectionMap(mColumnMap);
  43. SQLiteDatabase db=getReadableDatabase();
  44. return builder.query(db, columns, City.CITY_NAME + " like ? " + " or " + City.CITY_NICKNAME +" like ? ", new String[]{"%"+keyWord+"%", "%"+keyWord+"%"}, null, null,null);
  45. }
  46. }

6. 完成searchable.xml里面注册的ContentProvider

  1. public class CityContentProvider extends ContentProvider {
  2. public static final String AUTHORITY = "com.lichen.cityprovider";
  3. private SQLiteDatabase db;
  4. private CityDatabaseHelper dbHelper;
  5. private static final int QUERY_NORMAL= 1;
  6. private static final int QUERY_BY_ID= 2;
  7. private  static final  int QUERY_SEARCH_CITY_NAME= 3;
  8. public static UriMatcher uriMatcher;
  9. static{
  10. uriMatcher=new UriMatcher(UriMatcher.NO_MATCH);
  11. uriMatcher.addURI(AUTHORITY,"city", QUERY_NORMAL);
  12. uriMatcher.addURI(AUTHORITY,"city/#", QUERY_BY_ID);
  13. uriMatcher.addURI(AUTHORITY,SearchManager.SUGGEST_URI_PATH_QUERY, QUERY_SEARCH_CITY_NAME);
  14. uriMatcher.addURI(AUTHORITY,SearchManager.SUGGEST_URI_PATH_QUERY + "/*", QUERY_SEARCH_CITY_NAME);
  15. }
  16. @Override
  17. public boolean onCreate() {
  18. dbHelper = new CityDatabaseHelper(getContext());
  19. return dbHelper != null;
  20. }
  21. @Override
  22. public Cursor query(Uri uri, String[] projection, String selection,
  23. String[] selectionArgs, String sortOrder) {
  24. db = dbHelper.getReadableDatabase();
  25. switch (uriMatcher.match(uri)) {
  26. case QUERY_SEARCH_CITY_NAME:
  27. return dbHelper.search(selectionArgs[0]);
  28. default:
  29. throw new IllegalArgumentException("Unknown Uri: " + uri);
  30. }
  31. }
  32. }

like模糊查询对于大数据量效果可想而知,FTS3的支持还未尝试,详情参考Android SDK里面的Samples/SearchableDictionary

转:http://blog.csdn.net/lc19850921/article/details/8887387

(转)Android SearchView 搜索框的更多相关文章

  1. 【Android自己定义View实战】之自己定义超简单SearchView搜索框

    [Android自己定义View实战]之自己定义超简单SearchView搜索框 这篇文章是对之前文章的翻新,至于为什么我要又一次改动这篇文章?原因例如以下 1.有人举报我抄袭,原文链接:http:/ ...

  2. android浮动搜索框

    android浮动搜索框的配置比较繁琐,需要配置好xml文件才能实现onSearchRequest()方法. 1.配置搜索的XML配置文件​,新建文件searchable.xml,保存在res/xml ...

  3. Android 系统搜索框(有浏览记录)

    实现Android 系统搜索框(有浏览记录),先看下效果: 一.配置搜索描述文件  要在res中的xml文件加创建sreachable.xml,内容如下: <?xml version=" ...

  4. Android的搜索框SearchView的用法-android学习之旅(三十九)

    SearchView简介 SearchView是搜索框组件,他可以让用户搜索文字,然后显示.' 代码示例 这个示例加了衣蛾ListView用于为SearchView增加自动补全的功能. package ...

  5. Android actionbar 搜索框

    就是实如今顶部这种搜索框. 一.这个搜索框是actionbar上的menu上的一个item.叫SearchView.我们能够先在menu选项里定义好: bmap_menu.xml: <?xml ...

  6. Android 浮动搜索框 searchable 使用(转)。

    Android为程序的搜索功能提供了统一的搜索接口,search dialog和search widget,这里介绍search dialog使用.search dialog 只能为于activity ...

  7. Xamarin.Android 制作搜索框

    前段时间仿QQ做了一个搜索框样式,个人认为还不错,留在这里给大家做个参考,希望能帮助到有需要的人. 首先上截图(图1:项目中的样式,图2:demo样式): 不多说直接上代码: Main.axml &l ...

  8. Android学习笔记_79_ Android 使用 搜索框

    1.在资源文件夹下创建xml文件夹,并创建一个searchable.xml: android:searchSuggestAuthorityshux属性的值跟实现SearchRecentSuggesti ...

  9. Android开发 ---代码创建选项菜单、隐藏菜单项、菜单的生命周期,菜单按钮图标设置、搜索框、xml中设置子菜单

    1.activity_main.xml 描述: 定义了一个按钮 <?xml version="1.0" encoding="utf-8"?> < ...

随机推荐

  1. ORA-00911: 无效字符 问题和解决

    1.原本java插入数据库表数据写法是这样的 String sql = "INSERT INTO AAA (id1,id2,id3,id4) VALUES ('1','2','3','4') ...

  2. jQuery语法、选择器、效果等使用

    1.jQuery语法 1.1 基础语法:$(selector).action( ) 美元符号定义 jQuery 选择符(selector)“查询”和“查找” HTML 元素 jQuery 的 acti ...

  3. JavaSE环境下的shiro(源自腾讯课堂)

    Shiro作用: 认证(登录).授权(鉴权).加密(用户名/密码加密).会话管理(session).Web集成.缓存 apache官网可以下载 图一 图二 图三 图一 .二是配置文件内容,对于图三的: ...

  4. SST-超级简单任务调度器结构分析

    SST(Super Simple Task) 是一个基于任务优先级.抢占式.事件驱动.RTC.单堆栈的超级简单任务调度器,它基于Rober Ward一篇论文的思想,Miro Samek用C重新编程实现 ...

  5. 定义一个大数组时,出现错误,程序进入HardFault_Handler中断

    在原子的串口程序前加了几个数组定义,加了个对数组处理的函数,出现了HardFault_Handler的错误,不知道怎么解决!!! 因为局部变量是存放在栈区的,而全局变量在全局区(静态区),如果栈区较小 ...

  6. Django学习之mysql增删改查

    上节介绍了如何使用命令行操作mysql增删改查,现在介绍如何使用python管理mysql 使用pip 下载完mysql后,mysql会以pymysql模块的形式存储在pycharm的包文件里.我们通 ...

  7. python--模块之re正则表达式

    简介: 正则表达式本身是一个小型的.高度专业化的编程语言,而在python中,通过内嵌集成re模块,我们可以通过直接调用来实现正则匹配. 正则表达式基础知识: --普通字符匹配自身 abc ----a ...

  8. 成都Uber优步司机奖励政策(1月15日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  9. SQl 语句 表的连接

    当涉及到多个表查询时就需要使用将表连接的方法进行查询. SQL语句连接的方式根本上分为5种: •EQUI JOIN •SEMI JOIN 3 •ANTI JOIN 4 •CROSS JOIN •DIV ...

  10. P3379 【模板】最近公共祖先(LCA)

    P3379 [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询 ...