Android中运用查找提示
Android中使用查找提示
想在android中使用搜索提示,实现搜索功能,查了一些资料,现在记录在此。
首先是一个启示页面:
public class Finder extends Activity { /** Called when the activity is first created. */
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button button1 = (Button) findViewById(R.id.button); button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { onSearchRequested(); } }); } @Override public boolean onSearchRequested() { Bundle appDataBundle = new Bundle(); appDataBundle.putString("search", "开始搜索"); startSearch("搜索", false, appDataBundle, false); return true; } }
startSearch是基类提供的方法,完成后可以看到一个搜索框,但是没有任何提示和结果,别急,现在就告诉系统如何提供提示。
public class SearchProvider extends ContentProvider { @Override public int delete(Uri uri, String selection, String[] selectionArgs) { return 0; } @Override public String getType(Uri uri) { return null; } @Override public Uri insert(Uri uri, ContentValues values) { return null; } @Override public boolean onCreate() { // 添加所有的数据 SearchUtil.getInstance().ensureLoaded(); return true; } @Override public 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, // _id word.word, // text1 word.definition, // text2 word.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中 }; @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } }
这个类有点特殊,首先可以看到,它继承于ContentProvider, 我想顾名思义,应该就是为某项活动提供内容吧,这里我们要向搜索提供提示内容,那我们怎么让搜索知道这个提示类呢?
我们需要在Android的配置文件中写入一下一行,让系统知道我们写的这个提示类,这样当焦点在搜索输入框内的时候,就会触发我们的提示类。
<provider android:name="SearchProvider" android:authorities="search" android:syncable="false" />
完成以后,你应当可以在你的搜索筐内看到提示内容了。这里有一个小窍门,那就是生成提示的时候要用异步方法,这样就不会影响前台活动了。
最后就是搜索结果了。
public class ResultActivty extends Activity { @Override public 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() { @Override public 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); } @Override public 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 楼
ChoiRyonggun
2012-03-29
SearchUtil 这个类呢,
像我这样对Search完全没有头绪的根本看不下去了,
亲~~~~~~~~~~~~~~~~~~~~~.....
像我这样对Search完全没有头绪的根本看不下去了,
亲~~~~~~~~~~~~~~~~~~~~~.....