在我的应用中,我使用android.support.v7.widget.SearchView
(来自支持v7库)从操作栏提供搜索。
我在MainActivity中设置了这个视图,代码如下:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
this.menu = menu;
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SupportMenuItem searchMenuItem = (SupportMenuItem) menu.findItem(R.id.menu_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);
searchView.setQueryRefinementEnabled(true);
searchView.setIconifiedByDefault(true);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
// OnQueryTextListener body
...
});
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
return super.onCreateOptionsMenu(menu);
}
然后在Fragment中我需要确保SearchView已折叠:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
MenuItem searchMenuItem = menu.findItem(R.id.menu_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);
searchView.clearFocus(); // Try to prevent SearchView to steal focus. No luck!
searchView.setIconified(true);
}
@Override
public void onResume() {
super.onResume();
setHasOptionsMenu(true);
// other stuff
}
问题在于,不仅SearchView不会崩溃(我也尝试使用MenuItemCompat.collapseActionView(searchMenuItem)
但没有成功:它总是返回false
),而且SearchView在每个片段事务处“抢断”焦点(例如,将一个片段替换为另一个片段),因此当显示“新”片段时,SearchView具有焦点,因此它会显示其建议。
我还注意到如果我不打电话给setHasOptionsMenu
那么就不会出现“偷东西”的问题。
有什么我做错了吗?