我跟着google's tutorial为ActionBar设置了SearchView,但是我遇到了一些问题。我目前正在使用2.3.4和4.4.2设备测试我的应用。
我的2.3.4设备上遇到的问题
在我的4.4.2设备上,没有任何问题,但作为一个额外的问题,如何在从搜索结果活动返回后折叠搜索视图?我希望清除searchview并将我的操作栏恢复原状。
我可以搜索的主要活动
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
restoreActionBar();
//From Google tutorial
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView =
(SearchView) menu.findItem(R.id.search).getActionView();
searchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
}
return true;
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
} else if (id == R.id.search){
//From Google tutorial
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.HONEYCOMB) {
//Removing this will fix problem number 1 but the search function will not work
onSearchRequested();
}
return true;
}
return super.onOptionsItemSelected(item);
}
嗯,较低api设备的布局变化并不是什么大问题,但搜索功能和在结果后恢复操作栏更为重要
答案 0 :(得分:0)
最后,我找到了解决这个问题的方法。我认为google教程在支持Honeycomb API下的SearchView方面有些不对劲。根据教程,要为较低的API启用ActionBar searchview,您需要在onOptionsItemSelected()中添加onSearchRequested()。但是,这将导致我遇到的问题。
getActionView()是与低级API不兼容的方法,我从compat库中找到了MenuItemCompat.getActionView(),它适用于更高和更低的API。您现在应该删除onSearchRequested()以防止进一步的问题,并让getActionView()为它工作。至于处理结果,您可以使用元数据方法(来自Google教程,其中包含一些缺失的部分,找到另一个教程)或searchView.setOnQueryTextListener()。
这是固定代码:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
restoreActionBar();
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
MenuItem searchItem = (MenuItem) menu.findItem(R.id.search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
searchView.setOnQueryTextListener(this);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
//Don't add onSearchRequested() anymore here
return super.onOptionsItemSelected(item);
}