先放程序截图:
SearchManger是在SDK 1.6版本后才出现的API,根据需要可以进行设置,可满足不同的搜索需求,如:手机联系人、电话号码、存储卡的图片、网页关键词等。
SearchManger的作用是提供对系统搜索服务的访问,并且通过搜索方法提供诸如语音搜索等。
首先是主界面的布局设置:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/et1"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:hint="存储搜索数据" />
<Button
android:id="@+id/bt1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="insert" />
</LinearLayout>
搜索结果的页面布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tvquery"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tvdata"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="search" />
</LinearLayout>
浮动搜索框的使用并不是学习的难点,真正繁琐的是它的配置,首先在res下新建一个xml文件夹,并在文件夹中新建seachable.xml,或者CTRL+N调出wizard,选择android xml,然后Resource中选择Searchable,并且在下面的Root Element也选择Searchable,具体如下图:
接下来配置Searchable.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:hint="@string/_"
android:label="@string/searchbar"
android:searchMode="showSearchLabelAsBadge"
android:searchSuggestAuthority="com.android.coding.SearchSuggestionSampleProvider"
android:searchSuggestSelection=" ? " >
<!-- 注意,这里label的属性不能直接写任何的String,只能引用放到string.xml中的字符串 -->
</searchable>
android:searchSuggestAuthority属性中指向的SearchSuggestionSampleProvider实际上是一个SearhRecentSuggestionsProvider的子类:
package com.android.coding;
import android.content.SearchRecentSuggestionsProvider;
/**
* @ClassName SearchSuggestionSampleProvider
* @Description
* @author Cheng
* @date 2016-3-26
*/
public class SearchSuggestionSampleProvider extends
SearchRecentSuggestionsProvider {
public final static String authority =
"com.android.cbin.SearchSuggestionSampleProvider";
public final static int mode = DATABASE_MODE_QUERIES;
public SearchSuggestionSampleProvider() {
super();
setupSuggestions(authority, mode);
}
}
应用启动的第一个Activity为:MainActivity
package com.android.coding;
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.EditText;
public class MainActivity extends ActionBarActivity implements OnClickListener {
private EditText et_1;
private Button bt_1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_1 = (EditText) findViewById(R.id.et1);
bt_1 = (Button) findViewById(R.id.bt1);
bt_1.setOnClickListener(this);
}
@Override
public void onClick(View v) {
onSearchRequested();
}
public boolean onSearchRequested() {
String text = et_1.getText().toString();
Bundle bundle = new Bundle();
bundle.putString("data", text);
/*
* 打开浮动搜索框(第一个参数默认添加到搜索框的值),bundle为
* 传递的数据
*/
startSearch("Andy", false, bundle, false);
/*
* 一定要返回true,
* 如果返回super.onSearchRequested()方法,则该搜索框默认
* 值无法添加到搜索框中,bundle也无法传递出去
*/
return true;
}
}
处理搜索结果的Activity:SearchResultActivity
package com.android.coding;
import android.app.SearchManager;
import android.content.Intent;
import android.os.Bundle;
import android.provider.SearchRecentSuggestions;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class SearchResultActivity extends ActionBarActivity implements OnClickListener {
private Button btn_1;
private TextView tv_query;
private TextView tv_data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.result);
tv_data = (TextView) findViewById(R.id.tvdata);
tv_query = (TextView) findViewById(R.id.tvquery);
btn_1 = (Button) findViewById(R.id.btn1);
doSearchQuery();
btn_1.setOnClickListener(this);
}
private void doSearchQuery() {
final Intent intent = getIntent();
String query = intent.getStringExtra(SearchManager.QUERY);
tv_query.setText(query);
SearchRecentSuggestions suggestion = new SearchRecentSuggestions(this,
SearchSuggestionSampleProvider.authority,
SearchSuggestionSampleProvider.mode);
suggestion.saveRecentQuery(query, null);
if ((intent.ACTION_SEARCH).equals(intent.getAction())) {
Bundle bundled = intent.getBundleExtra(SearchManager.QUERY);
if (bundled != null) {
String data = bundled.getString("data");
tv_data.setText(data);
}else{
tv_data.setText("no data!");
}
}
}
@Override
public void onClick(View v) {
//这里可以添加利用当前页面处理搜索结果的方法
}
}