Android搜索建议(搜索联想)

简介: Android的搜索建议,简言之,就是说当用户输入某一个关键词后,系统自动给出几个含有相近关键词的搜索建议。效果图如下:MainActivity.

Android的搜索建议,简言之,就是说当用户输入某一个关键词后,系统自动给出几个含有相近关键词的搜索建议。

效果图如下:


MainActivity.java

package zhangphil.search;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.provider.SearchRecentSuggestions;
import android.view.View;
import android.widget.Button;

public class MainActivity extends ActionBarActivity {

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		Button search = (Button) findViewById(R.id.search);
		search.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// 发起搜索
				search();
			}
		});

		Button clear = (Button) findViewById(R.id.clear);
		clear.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				clear();
			}
		});
	}

	private void search() {
		// 向Android系统发起搜索请求。
		this.onSearchRequested();
	}

	// onSearchRequested()方法可以重载 ,也可以不用重载。取决于是否有更多参数或数据传递给下一步操作。
	// 通常代码运行逻辑需要传递更多数据给下一个动作时候,则可以重载此方法以完成更多数据的传递。
	// 如果不重载,也可以。Android系统会启动默认的搜索框。(在UI的上方)
	@Override
	public boolean onSearchRequested() {
		Bundle bundle = new Bundle();
		bundle.putString("some key", "some value");

		this.startSearch("输入搜索的关键词"/** 初始化搜索框中的提示词 */
		, true, bundle, false /** 此处若为true,则将启动手机上的全局设置的那个搜索,比如Google搜索 */
		);

		return true;
	}

	// 清除全部历史搜索记录
	private void clear() {
		SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
				ZhangPhilSuggestionProvider.AUTHORITY,
				ZhangPhilSuggestionProvider.MODE);
		// 出于用户隐私的考虑,给APP提供清除所有用户搜索历史记录的选项。
		suggestions.clearHistory();
	}
}

onSearchRequested将触发Android系统自动弹出搜索框。MainActivity需要的布局文件activity_main.xml很简单,两个按钮,一个触发搜索事件,一个触发清除搜索历史记录动作:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <Button
        android:id="@+id/search"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/search" />

    <Button
        android:id="@+id/clear"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/clear" />
    
</LinearLayout>


AndroidManifest.xml的内容:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="zhangphil.search"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="22" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android: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>
      
            <meta-data
                android:name="android.app.default_searchable"           
                android:value=".SearchActivity" />
        </activity>
        
        <activity
            android:name=".SearchActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.SEARCH" />
            </intent-filter>

            <meta-data
                android:name="android.app.searchable"
                android:resource="@xml/searchable" />
        </activity>

        <provider
            android:name=".ZhangPhilSuggestionProvider"
            android:authorities="ZhangPhil_AUTHORITY" />
    </application>

</manifest>


SearchActivity.java文件:

package zhangphil.search;

import android.app.Activity;
import android.app.SearchManager;
import android.content.Intent;
import android.os.Bundle;
import android.provider.SearchRecentSuggestions;
import android.widget.Toast;

public class SearchActivity extends Activity {

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		Intent intent = getIntent();
		if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
			// 存关键词
			saveMyRecentQuery(intent);
		}
	}

	private void saveMyRecentQuery(Intent intent) {
		// 把搜索的关键词保存到Android系统的自带的数据库中。
		// 如无必要定制,则此过程可以使用标准、通用的方法。
		String query = intent.getStringExtra(SearchManager.QUERY);

		SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
				ZhangPhilSuggestionProvider.AUTHORITY,
				ZhangPhilSuggestionProvider.MODE);
		suggestions.saveRecentQuery(query, null);

		Toast.makeText(this, "搜索关键词:" + query ,Toast.LENGTH_LONG).show();
	}
}




ZhangPhilSuggestionProvider.java

package zhangphil.search;

import android.content.SearchRecentSuggestionsProvider;

public class ZhangPhilSuggestionProvider extends
		SearchRecentSuggestionsProvider {
	// 可随意定义一个可区别的字符串,但注意全局的唯一相同引用。
	public final static String AUTHORITY = "ZhangPhil_AUTHORITY";

	public final static int MODE = DATABASE_MODE_QUERIES;

	public ZhangPhilSuggestionProvider() {
		setupSuggestions(AUTHORITY, MODE);
	}
}


searchable.xml

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_name"
    android:hint="@string/search_hint" 
    android:searchSuggestAuthority="ZhangPhil_AUTHORITY"
    android:searchSuggestSelection=" ?">
</searchable>

完整的项目全部代码文件我已经上传到CSDN,可以点击下载链接下载到本地,解压后导入到Eclipse运行演示。CSDN下载链接:

http://download.csdn.net/detail/zhangphil/8603509


相关文章
|
生物认证 开发工具 Android开发
安卓设备签到,还是用视觉智能平台人脸搜索1:N
安卓设备签到,还是用视觉智能平台人脸搜索1:N
177 2
|
6月前
|
Android开发
Android通讯录开发之通讯录联系人搜索功能最新实现
Android通讯录开发之通讯录联系人搜索功能最新实现
|
Android开发
Android 中实现模拟搜索的功能详解
Android 中实现模拟搜索的功能详解
91 0
|
11月前
|
Java 测试技术 持续交付
百度搜索:蓝易云【NetMock简介:简化 Java,Android和Kotlin多平台中的HTTP请求测试?】
使用NetMock,您可以在单元测试、集成测试和端到端测试中轻松地模拟和验证HTTP请求和响应,而无需实际发送请求到外部服务。这样可以提高测试的可靠性和可控性,并加快测试执行的速度。无论是在开发过程中还是在持续集成环境中,NetMock都可以帮助您更轻松地进行HTTP请求测试,提高代码质量和稳定性。
64 1
|
Android开发
Android 自定义弹窗 附带搜索过滤功能
前两天要求在项目中添加个小功能,今天正好有时间随手写了一个小demo,过程分享给大家。以后如果有此类需求可直接移植使用。
|
Java 开发工具 Android开发
安卓实战开发之——使用 WIFI 进行设备搜索并获取相应信息
实现使用 WIFI 进行连接设备搜索并获取相应信息的功能案例
261 0
|
Android开发
【Android源码篇】用grep搜索源码内容关键词
精确搜索A关键词,连同A.B也搜出来了。 用这条命令来搜索grep -rwn “ro.build.date” .,但是同时也显示了ro.build.date.utc属性,怎么在搜索的时候把这个多余的属性排除掉?
285 0
|
XML Java Android开发
Android 监听键盘输入(实现搜索、发送、完成等等)
在Android App的实际开发中,时常会需要监听软键盘的输入事件。 所以个人在此进行一个总结。 例如:微信和QQ聊天的消息发送,你会发现他的聊天框并没有发送的控件,软键盘的换行或者某个按钮会变成发送;在某些浏览器的输入框,输入内容后,软件盘的某个按钮会有搜索的字样,还有填写内容时的完成按钮等等,这些都可以通过监听键盘和输入框的一些配置实现这些功能。
|
XML SQL 缓存
Android MVVM框架使用(十二)记事本功能增强:视图类型、批量删除、搜索笔记
Android MVVM框架使用(十二)记事本功能增强:视图类型、批量删除、搜索笔记
277 0
Android MVVM框架使用(十二)记事本功能增强:视图类型、批量删除、搜索笔记
|
XML Android开发 数据格式
android google market 不能搜索到facebook或显示不兼容
android google market 不能搜索到facebook或显示不兼容
180 0