如何在 Android SearchView 中关闭键盘?
Posted
技术标签:
【中文标题】如何在 Android SearchView 中关闭键盘?【英文标题】:How to dismiss keyboard in Android SearchView? 【发布时间】:2011-11-16 13:56:17 【问题描述】:我在 ActionBar 中有一个 searchView。我想在用户完成输入后关闭键盘。我在 searchView 上有以下 queryTextListener
final SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener()
@Override
public boolean onQueryTextChange(String newText)
// Do something
return true;
@Override
public boolean onQueryTextSubmit(String query)
showProgress();
// Do stuff, make async call
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
return true;
;
基于类似的问题,以下代码应该关闭键盘,但在这种情况下不起作用:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
我也试过了:
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);
两者都不起作用。我不确定这是否是 Honeycomb 特定的问题,或者它是否与 ActionBar 中的 searchView 有关,或两者兼而有之。有没有人得到这个工作或知道为什么它不工作?
【问题讨论】:
【参考方案1】:我正在尝试做类似的事情。我需要从另一个Activity
启动SearchActivity
,并在加载时让搜索词出现在打开的搜索字段中。我尝试了上述所有方法,但最后(类似于Ridcully's answer above)我在onCreateOptionsMenu()
中将一个变量设置为SearchView
,然后在onQueryTextSubmit()
中调用clearFocus()
,当用户提交新搜索时:
private SearchView searchView;
@Override
public boolean onCreateOptionsMenu(Menu menu)
getMenuInflater().inflate(R.menu.search_menu, menu);
searchView = (SearchView) menu.findItem(R.id.menu_search)
.getActionView(); // set the reference to the searchView
searchView.setOnQueryTextListener(this);
searchMenuItem = (MenuItem) menu.findItem(R.id.menu_search);
searchMenuItem.expandActionView(); // expand the search action item automatically
searchView.setQuery("<put your search term here>", false); // fill in the search term by default
searchView.clearFocus(); // close the keyboard on load
return true;
@Override
public boolean onQueryTextSubmit(String query)
performNewSearch(query);
searchView.clearFocus();
return true;
【讨论】:
query
在onCreateOptionsMenu
中定义在哪里?
..这是在别处定义的查询字符串。我会编辑它。该行也不需要,仅当您想预填充查询并且第二个参数 (false) 阻止它运行查询时。
非常感谢! searchView.clearFocus() 是我目前缺少的部分
不要使用searchView.clearFocus()
,因为下一个视图会以动画为焦点(我认为你不想这样做)
你应该返回 false【参考方案2】:
简单、直截了当、干净利落:
@Override
public boolean onQueryTextSubmit(String query)
// your search methods
searchView.clearFocus();
return true;
【讨论】:
根据文档,这应该是正确的答案,返回布尔值:如果查询已由侦听器处理,则返回 true,返回 false 则让 SearchView 执行默认操作。 developer.android.com/reference/android/widget/… 不要使用searchView.clearFocus()
,因为下一个视图会以动画为焦点(我认为你不想这样做)
你应该返回 false【参考方案3】:
在 onQueryTextSubmit 上返回 false,如下所示
@Override
public boolean onQueryTextSubmit(String s)
return false;
【讨论】:
@lostintranslation 因为这是正常的 UI 行为【参考方案4】:如果你打电话,它会以某种方式工作
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);
然后
otherWidget.requestFocus();
【讨论】:
【参考方案5】:对我来说,上述方法都不适用于第一次提交。它隐藏起来,然后立即重新显示键盘。我必须在视图的处理程序上发布clearFocus()
才能在完成其他所有操作后实现它。
mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener()
@Override
public boolean onQueryTextSubmit(String query)
if (!"".equals(query))
mSearchView.post(new Runnable()
@Override
public void run()
mSearchView.clearFocus();
);
return true;
@Override
public boolean onQueryTextChange(String newText)
return false;
);
【讨论】:
【参考方案6】:对我来说,以下工作:
在我的活动中,我有一个成员变量
private SearchView mSearchView;
在onCreateOptionsMenu()
中我这样设置变量:
public boolean onCreateOptionsMenu(Menu menu)
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.library, menu);
mSearchView = (SearchView)menu.findItem(R.id.miSearch).getActionView();
mSearchView.setOnQueryTextListener(this);
return true;
最后在QueryTextListener
,我这样做了:
mSearchView.setQuery("", false);
mSearchView.setIconified(true);
我查看了 SearchView 的源代码,如果您不将查询文本重置为空字符串,SearchView 只会这样做,并且不会移除键盘。实际上,在源代码中深入挖掘,结果是一样的,yuku 建议,但我仍然更喜欢我的解决方案,因为我不必乱搞那些低级的东西。
【讨论】:
【参考方案7】:编辑:我在顶部添加了更好的解决方案,但也保留了旧答案作为参考。
@Override
public boolean onQueryTextSubmit(String query)
searchView.clearFocus();
return false;
原始答案:我使用 setOnQueryTextListener 进行编程。当搜索视图被隐藏时,键盘消失,然后当它再次可见时,键盘不会弹回。
//set query change listener
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener()
@Override
public boolean onQueryTextChange(String newText)
// TODO Auto-generated method stub
return false;
@Override
public boolean onQueryTextSubmit(String query)
/**
* hides and then unhides search tab to make sure keyboard disappears when query is submitted
*/
searchView.setVisibility(View.INVISIBLE);
searchView.setVisibility(View.VISIBLE);
return false;
);
【讨论】:
你为什么使用幻数,而不是常量本身?此外,这只是一个 hacky 答案。【参考方案8】:如果有人正在寻找如何折叠搜索视图/键盘,请使用以下代码
/*
setup close button listener
*/
searchView.findViewById<ImageView>(R.id.search_close_btn).setOnClickListener
adapter.filter(null)//reset default list
searchView.onActionViewCollapsed() //collapse SearchView/Keyboard
true
/*
setup text change listener
*/
searchView.setOnQueryTextListener(object:SearchView.OnQueryTextListener
override fun onQueryTextSubmit(query: String?): Boolean
adapter.filter(if(query.isNullOrEmpty()) "" else query)
searchView.onActionViewCollapsed() //collapse SearchView/Keyboard
return true
override fun onQueryTextChange(newText: String?): Boolean
adapter.filter(if(newText.isNullOrEmpty()) "" else newText)
return true
)
【讨论】:
【参考方案9】:在我正在使用双窗格活动的平板电脑应用中,我只写了
f.getView().requestFocus(); // f is the target fragment for the search
这足以在搜索后关闭软键盘。无需使用 InputMethodManager
【讨论】:
【参考方案10】:我使用了 ActionBarSherlock 4.3,我有一个 ProgressDialog。当我在 postExecute 方法中关闭它时,Searchview 获得焦点。要解决这个问题:
//Handle intent and hide soft keyboard
@Override
protected void onNewIntent(Intent intent)
setIntent(intent);
handleIntent(intent);
searchView.setQuery("", false);
searchView.setIconified(true);
searchView.clearFocus();
/*When dismiss ProgressDialog, searchview gain focus again and shows the keyboard. I call clearFocus() to avoid it.*/
AsyncTask.onPostExecute()
if(pd!=null)
pd.dismiss();
if(searchView!=null)
searchView.clearFocus();
希望对你有帮助。
【讨论】:
【参考方案11】:你可以使用它。
if (isKeybordShowing(MainActivity.this, MainActivity.this.getCurrentFocus()))
onBackPressed();
public boolean isKeybordShowing(Context context, View view)
try
InputMethodManager keyboard = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.hideSoftInputFromWindow(view.getWindowToken(), 0);
return keyboard.isActive();
catch (Exception ex)
Log.e("keyboardHide", "cannot hide keyboard", ex);
return false;
【讨论】:
【参考方案12】:两个对我有用的解决方案,第一个使用 SearchView 实例:
private void hideKeyboard()
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);
第二种解决方案:
private void hideKeyboard()
InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
【讨论】:
【参考方案13】:下面的代码可以让我在 Searchview 中隐藏键盘
MenuItem searchItem = baseMenu.findItem(R.id.menuSearch);
edtSearch= (EditText) searchItem.getActionView().findViewById(R.id.search_src_text);
MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener()
@Override
public boolean onMenuItemActionExpand(MenuItem item)
edtSearch.post(new Runnable()
@Override
public void run()
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(searchEditText.getWindowToken(), 0);
);
return true;
@Override
public boolean onMenuItemActionCollapse(MenuItem item)
return true;
);
【讨论】:
【参考方案14】:你为什么不试试这个?当您触摸 X 按钮时,无论如何都会触发对搜索视图的关注。
ImageView closeButton = (ImageView)searchView.findViewById(R.id.search_close_btn);
closeButton.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
EditText et = (EditText) findViewById(R.id.search_src_text);
et.setText("");`enter code here`
searchView.setQuery("", false);
searchView.onActionViewCollapsed();
menuSearch.collapseActionView();
);
【讨论】:
【参考方案15】:fun View.hideKeyboard()
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(windowToken, 0)
【讨论】:
【参考方案16】: @Override
public void onResume()
super.onResume();
searchView.clearFocus();
我尝试了上述所有答案,但没有一个有效,清除焦点 onResume 对我有用
【讨论】:
以上是关于如何在 Android SearchView 中关闭键盘?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Android 中展开的 SearchView(显示 10 个最近搜索)下方添加一个按钮(如“清除历史记录”)?
如何更改 SearchView 上的默认图标,以便在 Android 的操作栏中使用?