如何在Android SearchView中关闭键盘?
我在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有关,还是两者都没有。 有没有人使这种方法起作用或知道为什么它不起作用?
13个解决方案
65 votes
我正在尝试做类似的事情。 我需要从另一个Activity启动SearchActivity,并在加载时将搜索词显示在打开的搜索字段中。 我尝试了上述所有方法,但最终(类似于上述Ridcully的回答),我在onCreateOptionsMenu()中将变量设置为SearchView,然后在onQueryTextSubmit()中将其设置为clearFocus()在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("", 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;
}
bkurzius answered 2019-11-16T08:41:45Z
32 votes
简单,直接,干净:
@Override
public boolean onQueryTextSubmit(String query) {
// your search methods
searchView.clearFocus();
return true;
}
dazito answered 2019-11-16T08:42:11Z
22 votes
只需在onQueryTextSubmit上返回false,如下所示
@Override
public boolean onQueryTextSubmit(String s) {
return false;
}
Plugie answered 2019-11-16T08:42:39Z
11 votes
如果您拨打电话,它会以某种方式起作用
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);
然后
otherWidget.requestFocus();
Randy Sugianto 'Yuku' answered 2019-11-16T08:43:07Z
7 votes
对我来说,以下作品:
在我的活动中,我有一个成员变量
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建议,实际上,对源代码进行了足够深入的研究,但还是一样,但是我仍然更喜欢我的解决方案,因为我不必弄那些低级的东西。
Ridcully answered 2019-11-16T08:44:01Z
7 votes
对我来说,以上所有内容均未在第一次提交时进行。 它隐藏了,然后立即重新显示键盘。 我必须将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;
}
});
Till answered 2019-11-16T08:44:28Z
3 votes
编辑:我在上面添加了更好的解决方案,但也保留了旧答案作为参考。
@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;
}
});
Parnit answered 2019-11-16T08:45:02Z
1 votes
在我正在处理双窗格活动的平板电脑应用中,我只写了
f.getView().requestFocus(); // f is the target fragment for the search
这就足以在搜索后关闭软键盘。 无需使用InputMethodManager
Jose_GD answered 2019-11-16T08:45:44Z
1 votes
我使用了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();
}
希望能帮助到你。
Roger Garzon Nieto answered 2019-11-16T08:46:14Z
1 votes
您可以使用它。
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;
}
}
Mert TUTSAK answered 2019-11-16T08:46:36Z
0 votes
有两种解决方案对我有用,第一种使用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);
}
Jorgesys answered 2019-11-16T08:47:10Z
0 votes
下面的代码对我来说可以在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;
}
});
Ankita Shah answered 2019-11-16T08:47:37Z
0 votes
你为什么不试试这个? 触摸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();
}
});
Giancarlo Calderón Pereda answered 2019-11-16T08:48:04Z