日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android SearchView 搜索框

發布時間:2025/3/21 Android 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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



    本文轉自chainli 51CTO博客,原文鏈接:http://blog.51cto.com/lichen/1192652,如需轉載請自行聯系原作者

    ?

    總結

    以上是生活随笔為你收集整理的Android SearchView 搜索框的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 99精品99| 欧美乱日 | 久久午夜鲁丝片午夜精品 | 玖玖在线视频 | 三级视频网 | 毛片999 | 奇米第四色7777 | 国产精品丝袜黑色高跟 | 五月天婷婷在线观看 | 91秘密入口 | 精品人妻一区二区三区四区久久 | 日韩欧美国产电影 | 伊人五月婷婷 | 好吊操这里只有精品 | 天天视频黄 | 亚洲一区二区三区免费在线观看 | 国产人澡人澡澡澡人碰视频 | 日本欧美成人 | 欧美日韩一区在线 | 国产毛片一区二区三区va在线 | 久久网页 | 亚洲日本视频在线观看 | 一本久久a精品一合区久久久 | 日本狠狠爱 | 蜜桃av噜噜一区二区三区网址 | 一本久道综合色婷婷五月 | 狠狠摸狠狠操 | 日本视频在线免费观看 | 成人欧美一区二区三区在线播放 | 国产亚洲小视频 | 一本一道精品欧美中文字幕 | 亚洲一区二区三区久久 | 国模精品视频一区二区 | 久草视频国产 | 五月天婷婷在线播放 | 加勒比日韩| 两性囗交做爰视频 | 人人舔人人| 91丝袜在线观看 | 日本在线一| 性xxxx另类xxⅹ | 一区二区三区免费看 | 日韩欧美中文字幕一区二区 | 久久久久亚洲精品中文字幕 | 激情综合六月 | 综合色站导航 | 三级亚洲欧美 | 黄网免费视频 | 人善交videos欧美3d动漫 | 亚洲美女久久 | 好看的中文字幕 | 久久久久亚洲精品系列色欲 | 三上悠亚影音先锋 | 亚洲国产精品va在线看黑人 | 欧美插插视频 | 欧美成人a∨高清免费观看 国产精品999视频 | 亚洲成人av在线播放 | 传媒一区二区 | 欧美成人三级在线 | 给我免费观看片在线电影的 | 国产麻豆精品一区二区 | 色婷婷在线影院 | 国产三级国产精品 | 欧美激情不卡 | 一区二区三区视频 | 李丽珍裸体午夜理伦片 | 高清在线一区二区 | 野花视频在线观看免费 | 亚洲欧美一区在线 | 欧美一级免费观看 | 欧美视频一二三区 | 日韩在线视频免费播放 | 自拍偷拍一区 | 国产偷拍一区二区三区 | 91免费在线视频观看 | 国产精品爱啪在线线免费观看 | 成人在线免费观看网站 | 日本一二三区在线 | 日韩精品免费一区二区夜夜嗨 | 97影院手机版 | 在线观看你懂的网址 | 亚洲精品视频在线 | 国产成a人亚洲精v品在线观看 | 一区二区三区免费毛片 | 日本不卡影院 | 欧美日本在线视频 | 97超碰在线免费 | 91精品视频网| 色婷五月| 成人有色视频 | 久草精品国产 | 国产中文字幕在线视频 | 四虎国产成人精品免费一女五男 | 亚洲av无码一区二区乱子仑 | aaa国产精品| 久久77 | 大奶毛片 | 亚洲一区二区91 | 国产一区二区在线免费观看 |