详细解读Android中的搜索框(二)—— Search Dialog
Search Dialog是提供搜索的控件之一,还有一个是上次小例子给出的searchView,关于SearchView的东西后面会说到。本次先从Search Dialog说起,让大家慢慢理解android中搜索的控件的机制,逐渐引出搜索信息传递和搜索配置的知识,铺垫到最后再给大家说searchview的话,大家就能很容易理解。
一、Search Dialog 和 Search View
这两个其实都是一个搜索控件,区别不大,但多少还是有些小的差异的。
不同点:
该文件一般约定为searchable.xml并位于res/xml/目录下。searchable.xml必须以<searchable> element 作为根节点,且至少定义一个属性。
<?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android"android:hint="@string/search_hint"android:label="@string/app_name" android:icon="@drawable/kale"></searchable>
<activityandroid:name=".MainActivity"android:label="@string/app_name"android:launchMode="singleTop" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><!-- enable the search dialog to send searches to SearchableActivity --><meta-dataandroid:name="android.app.default_searchable"android:value="com.kale.searchdialogtest.SearchActivity" /></activity><activityandroid:name="com.kale.searchdialogtest.SearchActivity"android:launchMode="singleTop" ><intent-filter><action android:name="android.intent.action.SEARCH" /></intent-filter><meta-dataandroid:name="android.app.searchable"android:resource="@xml/searchable" /></activity>
为了方便解释,我们直接看主要代码:
MainActivity:
<activityandroid:name=".MainActivity"android:launchMode="singleTop" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><!-- enable the search dialog to send searches to SearchableActivity --><meta-dataandroid:name="android.app.default_searchable"android:value="com.kale.searchdialogtest.SearchActivity" /></activity>
<!-- enable the search dialog to send searches to SearchableActivity --><meta-dataandroid:name="android.app.default_searchable"android:value="com.kale.searchdialogtest.SearchActivity" />
1. 必须包含“
android:value”属性,该属性指明了
searchable activity的类名,
android:name",
且其值必须为 "android.app.default_searchable"
.
<activityandroid:name="com.kale.searchdialogtest.SearchActivity"android:launchMode="singleTop" ><intent-filter><action android:name="android.intent.action.SEARCH" /></intent-filter><meta-dataandroid:name="android.app.searchable"android:resource="@xml/searchable" /></activity>
依据建议,用于展示搜索结果的activity应该用singleTop模式,同时要强制写上如下内容。
<intent-filter><action android:name="android.intent.action.SEARCH" /></intent-filter><meta-dataandroid:name="android.app.searchable"android:resource="@xml/searchable" />
如果对activity的隐式启动有所了解的话,我们一眼就看出为什么要这么定义了。在MainActivity中系统会在用户提交搜索时产生一个intent,并且给intent放入搜索词,而且还定义了一个action。系统这时就开始找哪个activity中定义了 <action android:name="android.intent.action.SEARCH" />,找到这个activity后就会自动启动我们的这个searchActivity。至于meta-data中的东西,其实就是一个search的配置信息。
package com.kale.searchdialogtest;public class MainActivity extends ActionBarActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button btn = (Button) findViewById(R.id.show_dialog_button);btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {onSearchRequested();}});}}
很简单吧,通过onSearchRequested()我们就可以让activity中显示出一个search dialog,所以在某种意义上说,search dialog不用程序员进行过多干预。
package com.kale.searchdialogtest;import android.content.Intent; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button;public class MainActivity extends ActionBarActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button btn = (Button) findViewById(R.id.show_dialog_button);btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {onSearchRequested();}});} // 重写onSearchRequested方法 @Overridepublic boolean onSearchRequested() {// 除了输入查询的值,还可额外绑定一些数据Bundle appSearchData = new Bundle();appSearchData.putString("KEY", "text");startSearch(null, false, appSearchData, false);// 必须返回true。否则绑定的数据作废return true;}}
我们在这里面放入了一个键值对,KEY-text。
package com.kale.searchdialogtest;import android.app.Activity; import android.app.SearchManager; import android.content.Intent; import android.os.Bundle; import android.widget.TextView; import android.widget.Toast;/*** @author:Jack Tony* @description :真正执行搜索和结果展示的Activity 一旦用户在search dialog中执行search操作,* 系统将启动SearchableActivity 并向其传送ACTION_SEARCH intent.* @date :2015年1月15日* * 参考自:http://zhouyunan2010.iteye.com/blog/1134147*/ public class SearchActivity extends Activity {protected void onCreate(android.os.Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.search_activity);// Get the intent, verify the action and get the queryIntent intent = getIntent();if (Intent.ACTION_SEARCH.equals(intent.getAction())) {String query = intent.getStringExtra(SearchManager.QUERY);doMySearch(query);}// 获得额外递送过来的值Bundle appData = intent.getBundleExtra(SearchManager.APP_DATA);if (appData != null) {String testValue = appData.getString("KEY");System.out.println("extra data = " + testValue);}}private void doMySearch(String query) {// TODO 自动生成的方法存根TextView textView = (TextView) findViewById(R.id.search_result_textView);textView.setText(query);Toast.makeText(this, "do search", 0).show();} }
主要内容是从intent中获得数据,然后进行处理。这里仅仅获得了数据,没有进行真正的搜索。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.kale.searchdialogtest"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="18" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name=".MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><intent-filter><action android:name="android.intent.action.SEARCH" /></intent-filter><meta-dataandroid:name="android.app.searchable"android:resource="@xml/searchable" /></activity></application></manifest>
<activityandroid:name=".MainActivity" > <intent-filter><action android:name="android.intent.action.SEARCH" /></intent-filter><meta-dataandroid:name="android.app.searchable"android:resource="@xml/searchable" /></activity>
<meta-dataandroid:name="android.app.searchable"android:resource="@xml/searchable" />
<meta-dataandroid:name="android.app.default_searchable"android:value="com.kale.searchdialogtest.MainActivity" />
package com.kale.searchdialogtest;import android.app.SearchManager; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast;public class MainActivity extends ActionBarActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);handleIntent(getIntent());Button btn = (Button) findViewById(R.id.show_dialog_button);btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {onSearchRequested();}});}private void handleIntent(Intent intent) {if (Intent.ACTION_SEARCH.equals(intent.getAction())) {String query = intent.getStringExtra(SearchManager.QUERY);doMySearch(query);}}private void doMySearch(String query) {// TODO 自动生成的方法存根Toast.makeText(this, "do search " + query, 0).show();}}
<activityandroid:name=".MainActivity"android:label="@string/app_name"android:launchMode="singleTop" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><intent-filter><action android:name="android.intent.action.SEARCH" /></intent-filter><meta-dataandroid:name="android.app.searchable"android:resource="@xml/searchable" /></activity>
package com.kale.searchdialogtest;import android.app.SearchManager; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast;/*** @author:Jack Tony* @description :* * 当系统调用onNewIntent(Intent)的时候,表示activity并不是新建的, 所以getIntent()返回的还是* 在onCreate()中接受到的intent.* 因此你必须在onNewIntent(Intent)调用setIntent(Intent)来* (这样保存的intent才被更新,之后你可以同过getIntent()来取得它).* * @date :2015年1月15日*/ public class MainActivity extends ActionBarActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button btn = (Button) findViewById(R.id.show_dialog_button);btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {onSearchRequested();}});} @Overrideprotected void onNewIntent(Intent intent) {setIntent(intent);handleIntent(intent);}private void handleIntent(Intent intent) {if (Intent.ACTION_SEARCH.equals(intent.getAction())) {String query = intent.getStringExtra(SearchManager.QUERY);doMySearch(query);}}private void doMySearch(String query) {// TODO 自动生成的方法存根Toast.makeText(this, "do search " + query, 0).show();}}
onNewIntent(Intent)的时候,表示
activity并不是新建的, 所以getIntent()返回的还是
在onCreate()中接受到的intent
. 因此你必须在onNewIntent(Intent)调用
setIntent(Intent)来 (这样保存的intent才被更新,之后你可以同过getIntent()来取得它
)
详细解读Android中的搜索框(二)—— Search Dialog相关推荐
- Android中MaterialSearchView(搜索框)的简单实用
Android中MaterialSearchView(搜索框)的简单实用 收搜框架有好多,动画效果满炫酷的就是代码太多,没发抽取他的搜索功能,而这个却比较好用些,直接从代码里面抠出来一个简单实现搜索功 ...
- android中联系人搜索框
在开发中经常用到获取联系人和搜索框,今天总结一下. 代码很多借鉴于:http://blog.csdn.net/wyzxk888/article/details/8800407 在些基础上做了修改,代码 ...
- android 自定义搜索框edittext,Android编程自定义搜索框实现方法【附demo源码下载】...
本文实例讲述了Android编程自定义搜索框实现方法.分享给大家供大家参考,具体如下: 先来看效果图吧~ 分析:这只是模拟了一个静态数据的删除与显示 用EditText+PopupWindow+lis ...
- python方法_详细解读Python中的__init__()方法
__init__()方法意义重大的原因有两个.第一个原因是在对象生命周期中初始化是最重要的一步:每个对象必须正确初始化后才能正常工作.第二个原因是__init__()参数值可以有多种形式. 因为有很多 ...
- 你真的了解大数定律吗?(详细解读机器学习中的大数定律)
你真的了解大数定律吗?(详细解读机器学习中的大数定律) 前言 大数定律 生活中的预言家们 小数定律的骗局 大数定律的含义 中心极限定理 概率故事-捉羊问题 前言 大数定律也是伯努利定律,是历史上第一个 ...
- 详细解读Maven中pom.xml
详细解读Maven中pom.xml 一.POM是什么 二.存放位置 三.基本设置 3.1.头信息 3.2.maven的基本信息 3.3.POM之间的关系 3.3.1.依赖关系 3.3.2 继承关系:继 ...
- 电话中删除搜索框内的语音图标按钮。所有应用菜单上面的搜索框当菜单下拉后会重叠。相机视频拍的设置里面有个EIS,删除这个菜单,默认开启EIS。视频画质默认720p。
电话中删除搜索框内的语音图标按钮: override/vendor/mediatek/proprietary/packages/apps/Dialer/java/com/android/dialer/ ...
- iOS中UISearchBar(搜索框)使用总结
2019独角兽企业重金招聘Python工程师标准>>> iOS中UISearchBar(搜索框)使用总结 初始化:UISearchBar继承于UIView,我们可以像创建View那样 ...
- 原生微信小程序,搜索框(search)组件
原生微信小程序,搜索框(search)组件 首先创建组件及两个跳转页面,第一个是搜索框所在的页面(首页),第二个是搜索详细页 搜索框的本质是:搜索框不是input,而是navigate,跳转到专门的搜 ...
最新文章
- Class101–如何高效地构建强大的数字绘画
- 网上看的一篇文章,感觉会给程序员一些启发
- 60进制计算器在线_超长假期用华为MatePad Pro在线听课是怎样的体验?
- 两个构件的重合点_初三物理易错点:你被眼睛欺骗了,那些『平面镜成像』中的困惑...
- 创建安卓模拟器的两种方式及常用Android命令介绍
- 【vue】webpack插件svg-sprite-loader---实现自己的icon组件
- C++ 数据指针(-)
- 杭州电子科技大学计算机专硕表数二,杭州电子科技大学 计算机学院 2016级计算机技术(专硕)培养方案...
- 数据结构折半查找例题_数据结构第9章例题与答案
- 800乘600的分辨率_600元能买到啥配置的手机?
- mac 下 hadoop、spark 的安装及配置
- spark架构设计编程模型 02
- zipf定律与相似性度量
- 2015中国(深圳)互联网金融创新峰会暨第二届云海汇梦想年会圆满成功
- Sublime Text 3 安装控件中心时报错Error validating download (got 6f4c264a24d933ce70df5dedc)
- 备案服务器查询网站,网站服务器备案查询
- 通过网页链接直接下载APK
- 多人群聊聊天室java_#java 聊天室(一)—— 实现一个简单Telnet多人群聊聊天室...
- SQL Server2008从入门到精通pdf
- 【matplotlib教程】绘图样式,文本线型、轴刻度
热门文章
- db链接相关链接相关参数理解
- [转]How to Improve Entity Framework Add Performance?
- html开发日记-form button
- Linux下C编程-----IO/文件操作 模拟linux ls程序显示文件系统树形结构(2)
- java写 excel
- XMPP核心协议客户端
- 基于Spark的电影推荐系统(电影网站)
- C#执行osql脚本时部分脚本未执行
- ASP.NET CORE的Code Fist后Models更改了怎么办?
- Kotlin中使用RxJAVA的map()操作符遇到的问题