解决ActionBar中SearchView提交及按返回键无法收起的问题
解决SearchView提交后不折叠及返回键无法折叠的问题
嘿,这个问题我之前也碰到过——默认的SearchView确实不会自动在提交搜索或者按返回键时折叠,得我们手动给它加逻辑才行。下面是具体的解决步骤,都是实战验证过的:
1. 给SearchView加搜索提交监听,触发折叠动作
首先在你设置菜单的地方(Activity的onCreateOptionsMenu或者Fragment的对应方法),拿到SearchView实例后,监听搜索提交事件,提交完成后主动调用折叠方法:
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_search, menu); MenuItem searchItem = menu.findItem(R.id.app_bar_search); SearchView searchView = (SearchView) searchItem.getActionView(); // 监听搜索提交 searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { // 先处理你的搜索业务逻辑,比如调用搜索接口 doYourSearchLogic(query); // 关键:折叠SearchView searchItem.collapseActionView(); // 可选:清空搜索框内容,避免下次展开还显示之前的输入 searchView.setQuery("", false); return true; // 告诉系统我们已经处理了提交事件 } @Override public boolean onQueryTextChange(String newText) { // 这里可以加实时搜索的逻辑,不需要的话返回false就行 return false; } }); // 可选:监听SearchView的展开/折叠状态,比如折叠时自动清空内容 searchItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() { @Override public boolean onMenuItemActionExpand(MenuItem item) { return true; // 允许展开SearchView } @Override public boolean onMenuItemActionCollapse(MenuItem item) { searchView.setQuery("", false); return true; // 允许折叠SearchView } }); return super.onCreateOptionsMenu(menu); }
2. 拦截返回键,优先折叠SearchView
默认按返回键会直接退出当前页面,我们要先判断SearchView是否处于展开状态,如果是,就先折叠它,再执行默认逻辑:
@Override public void onBackPressed() { MenuItem searchItem = menu.findItem(R.id.app_bar_search); // 或者从已保存的引用中获取 if (searchItem != null && searchItem.isActionViewExpanded()) { searchItem.collapseActionView(); // 可选:清空搜索框 SearchView searchView = (SearchView) searchItem.getActionView(); searchView.setQuery("", false); } else { // 如果SearchView没展开,就执行默认的返回操作 super.onBackPressed(); } }
3. 别忘了给menu item加折叠标记
最后检查下你的menu_search.xml,确保item里加上了collapseActionView,这样系统才知道这个菜单项支持折叠动作:
<item android:id="@+id/app_bar_search" android:icon="@drawable/ic_search_white_24dp" android:title="Search" app:actionViewClass="android.widget.SearchView" app:showAsAction="always|collapseActionView" />
如果是在Fragment里使用,记得在onCreate方法里调用setHasOptionsMenu(true);,这样Fragment才能接收菜单相关的回调。
内容的提问来源于stack exchange,提问作者Antariksh
相关产品推荐
相关产品推荐

