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功能,发布自己的地理信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值