读过了android developer上面关于search的那些指南,可是还有些疑问。
1 关于activity之间的关系
搜索涉及到两部分,用户输入和请求处理,那么我想知道用户输入所在的Activity和请求处理所在的Activity是同一个吗?
按照指南,配置搜索的步骤:
1)创建activity
<activity
android:name="com.app.maplite.activity.SearchActivity"
android:launchMode="singleTop" >
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
那么我想知道这个SearchActivity是作为用户输入Activity还是请求处理Activity的?
根据指南说的,系统接到search请求之后将相关数据放入intent然后发送到这个SearchActivity,看样子他是属于请求处理的,如果说是这样的话,那个meat-data要来何用?按照我的理解,meta-data这部分是用来定制搜索框展示情况的,这跟SearchActivity有个毛的关系?
根据我自己的测试,好像用户输入和请求处理必须在同一个Activity里面,如果这样的话,为什么要通过Intent这样的方法来传递搜索数据,这导致Activity的交互啊,真的很麻烦,是我理解有误还是怎么的?
2)我自己的代码有些问题,希望能解答一下。
<activity
android:name="com.app.activity.MapActivity"
android:label="@string/title_activity_map"
android:launchMode="singleTop" >
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
Activity:
public class MapActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
handleIntent(getIntent());
}
private void handleIntent(Intent intent) {
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
Log.d("map", "do serach from new intent " + keyword);
String keyword = intent.getStringExtra(SearchManager.QUERY);
doSearch(keyword, null);
}
}
@Override
protected void onNewIntent(Intent intent) {
setIntent(intent);
handleIntent(intent);
}
private void doSearch(String keyword, String type) {
Log.d("map", "do serach " + keyword);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.u_action_menu_map, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String key) {
Log.d("map", "query test submit:" + key);
doSearch(key, null);
return true;
}
@Override
public boolean onQueryTextChange(String key) {
return false;
}
});
return super.onCreateOptionsMenu(menu);
}
}
运行后,点击搜索“xx”后,会触发多次搜索事件,也就是说
Log.d("map", "do serach " + keyword);
会触发多次,问题我想就是由于Activity跳转引起的吧,但是不知道如何解决。
额,我也遇到这个问题,搞了好久,解决了http://segmentfault.com/blog/tcstory/1190000002611886