想在android中使用搜索提示,实现搜索功能,查了一些资料,现在记录在此。

首先是一个启示页面:

public class Finder extends Activity {    /** Called when the activity is first created. */
 
@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);Button button1 = (Button) findViewById(R.id.button);button1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {onSearchRequested();}});}@Overridepublic boolean onSearchRequested() {Bundle appDataBundle = new Bundle();appDataBundle.putString("search", "开始搜索");startSearch("搜索", false, appDataBundle, false);return true;}}

startSearch是基类提供的方法,完成后可以看到一个搜索框,但是没有任何提示和结果,别急,现在就告诉系统如何提供提示。

public class SearchProvider extends ContentProvider {@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {return 0;}@Overridepublic String getType(Uri uri) {return null;}@Overridepublic Uri insert(Uri uri, ContentValues values) {return null;}@Overridepublic boolean onCreate() {// 添加所有的数据SearchUtil.getInstance().ensureLoaded();return true;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {String query = null;if (uri.getPathSegments().size() > 1) {query = uri.getLastPathSegment().toLowerCase();}return getSuggestions(query);}private Cursor getSuggestions(String query) {String processedQuery = query == null ? "" : query.toLowerCase();List<SearchUtil.Word> words = SearchUtil.getInstance().getMatches(processedQuery);MatrixCursor cursor = new MatrixCursor(COLUMNS);long id = 0;for (SearchUtil.Word word : words) {cursor.addRow(columnValuesOfWord(id++, word));}return cursor;}private Object[] columnValuesOfWord(long id, SearchUtil.Word word) {return new Object[] { id, // _idword.word, // text1word.definition, // text2word.definition, // intent_data (included when clicking on item)};}private static final String[] COLUMNS = { "_id",SearchManager.SUGGEST_COLUMN_TEXT_1,SearchManager.SUGGEST_COLUMN_TEXT_2,SearchManager.SUGGEST_COLUMN_INTENT_DATA,// 数据传递到intenter中};@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {// TODO Auto-generated method stubreturn 0;}}

这个类有点特殊,首先可以看到,它继承于ContentProvider, 我想顾名思义,应该就是为某项活动提供内容吧,这里我们要向搜索提供提示内容,那我们怎么让搜索知道这个提示类呢?

我们需要在Android的配置文件中写入一下一行,让系统知道我们写的这个提示类,这样当焦点在搜索输入框内的时候,就会触发我们的提示类。

<provider android:name="SearchProvider" android:authorities="search"android:syncable="false" />

完成以后,你应当可以在你的搜索筐内看到提示内容了。这里有一个小窍门,那就是生成提示的时候要用异步方法,这样就不会影响前台活动了。

最后就是搜索结果了。

public class ResultActivty extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Intent intent = this.getIntent();setContentView(R.layout.main);if (Intent.ACTION_VIEW.equals(intent.getAction())) {;launchWord(intent.getDataString().trim());finish();} else {Button button = (Button) findViewById(R.id.button);button.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {onSearchRequested();return false;}});}}private void launchWord(String key) {Intent next = new Intent();next.setClass(this, PeoplePage.class);Bundle bundle = new Bundle();bundle.putString("name", key);next.putExtras(bundle);startActivity(next);}@Overridepublic boolean onSearchRequested() {Bundle appDataBundle = new Bundle();appDataBundle.putString("Key", "开始搜索");startSearch("搜索", false, appDataBundle, false);return true;}}

这是一个普通的活动,我们的搜索关键字会被记录在intent.getDataString()中,但是搜索程序怎么知道把搜索条件传给谁呢?

那还是要依赖于我们万能的intent事件驱动系统了,我们需要在android的配置中加上一下这行。

<activity android:name=".ResultActivty" android:label="@string/search_query_results"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.SAMPLE_CODE" /></intent-filter><intent-filter><action android:name="android.intent.action.SEARCH" /><category android:name="android.intent.category.DEFAULT" /></intent-filter><meta-data android:name="android.app.searchable"android:resource="@xml/searchable" /></activity>

这样就可以了。

加上一些电话和甩动效果,花了两个晚上让这个东东在手机上跑起来。

如果有问题可以回帖交流。

明天写一下怎么使用location功能,发布自己的地理信息。

更多相关文章

  1. android 添加button事件后 提示 view cannot be resolved to a t
  2. Android集成银联支付,提示java.lang.UnsatisfieldLinkError错误
  3. Mono for Android(安卓)(2)-- Android应用程序初认识
  4. Android的系统架构
  5. 【Android笔记】探究活动②使用Intent在活动之间穿梭
  6. Android(安卓)cursor query方法详解
  7. Android(安卓)之 自动提示功能(AutoCompleteTextView)的使用
  8. 【Android(安卓)Api 翻译4】android api 完整翻译之Contacts Pro
  9. Android(安卓)混淆提示 java.io.FileNotFoundException: ...\pr

随机推荐

  1. Android(安卓)VR效果GoogleVR
  2. 2012.08.23——— android ndk 编译多个s
  3. android Aidl 实现进程间通讯
  4. Android(安卓)性能优化二 内存优化
  5. Android中的AutoCompleteTextView的使用
  6. android 格式化
  7. android 关于截屏
  8. android中的两端对齐
  9. Ubuntu下adb在不到Android设备(windows的
  10. Android(安卓)SDK 下载地址