如何自定义Android搜索对话框默认行为?提交后关闭对话框与软键盘
解决SearchView提交搜索后不收起及软键盘未关闭问题
核心解决方案
要实现提交搜索后折叠搜索框并关闭软键盘,需完成两个关键操作:折叠SearchView对应的ActionView,以及调用系统服务隐藏软键盘。具体步骤如下:
- 保存搜索菜单项引用
在Activity中添加成员变量,用于保存搜索对应的MenuItem实例,方便后续调用折叠方法:
private MenuItem searchMenuItem;
- 修改onCreateOptionsMenu获取并保存MenuItem
更新菜单初始化代码,将搜索项的MenuItem实例保存下来:
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.appbar_menu, menu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); // 保存搜索菜单项引用 searchMenuItem = menu.findItem(R.id.search_box); SearchView searchView = (SearchView) searchMenuItem.getActionView(); searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); return super.onCreateOptionsMenu(menu); }
- 在搜索处理完成后折叠搜索框并关闭软键盘
在handleIntent方法的搜索逻辑执行完毕后,添加折叠和软键盘关闭代码:
public void handleIntent(Intent intent) { TextView tv = (TextView) popupView.findViewById(R.id.list_food_name); if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String query = intent.getStringExtra(SearchManager.QUERY); Log.e("Message :","The search intent was received"); Log.e("Message :","The search query was: " + query); // Bind the popup children Iterator iterator = DatabaseOpenHelper.foodList.iterator(); while (iterator.hasNext()) { Food food = (Food) iterator.next(); if (food.getFoodName().equals(query)) { Log.e("Message :", "Food name is :" + food.getFoodName()); tv.setText(food.getFoodName()); Log.e("Message :", "The listFoodName TextView text is :" + tv.getText()); } } popupWindow.showAtLocation(popupView, Gravity.CENTER, 0, 0); // 折叠搜索框 if (searchMenuItem != null && searchMenuItem.isActionViewExpanded()) { searchMenuItem.collapseActionView(); } // 隐藏软键盘 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0); } }
补充说明
collapseActionView()方法会将展开的SearchView折叠回应用栏的图标状态,同时自动清除搜索框焦点。- 使用
InputMethodManager的hideSoftInputFromWindow方法,传入当前窗口DecorView的WindowToken,可确保软键盘被强制关闭,不受当前焦点View的影响。
内容的提问来源于stack exchange,提问作者azeemofwalsall
相关产品推荐
相关产品推荐

