软键盘上的自动折叠ActionBar SearchViewclosures

我目前正在使用一个ActionBar菜单项来显示一个SearchView在操作栏中。 当search菜单项被展开时,软键盘被显示,这是我想要的。 现在,当用户按下后退buttonclosures软键盘时,我也想在操作栏中折叠SearchView。

我已经尝试在MenuItem和ActionView上实现以下监听器OnKeyListener和OnFocusChangeListener。 我也尝试在Activity中使用OnBackPressed()。 当后退button用于closures软键盘时,以上都没有发现。

有任何想法吗?

我已经实现了OnActionExpandListener来知道什么时候可以看到SearchView。

我会扩展@ user1258568的懒惰答案。 这对我有效。 请注意,当焦点丢失时,它会清除您的查询。

final MenuItem searchMenuItem = optionsMenu.findItem(R.id.search); final SearchView searchView = (SearchView) searchMenuItem.getActionView(); searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean queryTextFocused) { if(!queryTextFocused) { searchMenuItem.collapseActionView(); searchView.setQuery("", false); } } }); 

我find了更好的解决scheme。

 searchView.setOnQueryTextFocusChangeListener(). 

当键盘显示或隐藏时, OnQueryTextFocusChangeListener被调用。 当显示键盘并且search视图将具有焦点时,首先调用。 当keyboard被隐藏并且search视图将失去焦点时,会再次调用,可以close search view然后使用

 menuItem.collapseActionView(). 

只是像这样覆盖onBackPressed:

 @Override public void onBackPressed() { if (searchView.isShown()){ searchView.onActionViewCollapsed(); //collapse your ActionView searchView.setQuery("",false); //clears your query without submit isClosed = true; //needed to handle closed by back } else{ super.onBackPressed(); } } 

和你的onCreateOptionsMenu会像这样膨胀mSearchView:

 @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); getMenuInflater().inflate(R.menu.menu_search, menu); mSearchView = (SearchView) menu.findItem(R.id.menu_action_search).getActionView(); mSearchView.setOnQueryTextListener(this); mSearchView.setOnSearchClickListener(this); mSearchView.setOnCloseListener(this); isClosed = true; return true; } 

你有没有这样的类实现如下:

 public class myActivity extends FragmentActivity implements SearchView.OnQueryTextListener, View.OnClickListener, SearchView.OnCloseListener { 

您还需要:

 @Override public void onClick(View view) { isClosed = false; } @Override public boolean onClose() { isClosed = true; return false; } 

您需要将“mSearchView”和“isClosed”这两个全局variables都设置为该活动。

Jon Willis的回答非常好。 这是对他的回答的改进。

首先,创build一个实现View.OnFocusChangeListener的新类:

 public class SearchViewFocusListener implements View.OnFocusChangeListener { private final MenuItem mMenuItem; public SearchViewFocusListener(MenuItem menuItem) { mMenuItem = menuItem; } @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { mMenuItem.collapseActionView(); if (v instanceof SearchView) { ((SearchView) v).setQuery("", false); } } } } 

接下来,在您的SearchView上设置监听器:

 searchView.setOnQueryTextFocusChangeListener(new SearchViewFocusListener(menuItem)); 

这是我为了使键盘消失所做的。 你可以尝试看看这是否适合你。 我将searchView设置为不可见,然后再次可见。

  //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; } }); 

这是可以实现的:

  private void setupSearchView(Menu menu) { final MenuItem searchMenuItem = menu.findItem(R.id.action_search); final SearchView searchView = (SearchView) searchMenuItem.getActionView(); [...] searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { searchMenuItem.collapseActionView(); return false; } @Override public boolean onQueryTextChange(String newText) { return true; } }); } 

基于setOnQueryTextFocusChangeListener()的解决scheme不适用于我,因为事件没有启动 – searchView在提交时没有失去焦点,可能是因为我在包含search视图的相同活动中执行search。

无论如何,我认为使用OnQueryTextListener更加正确,因为它更准确地描述了提交文本的事件。

您只需要在菜单布局中放置“collapseActionView”属性即可

 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/menu_item_search" android:title="@string/search" android:iconifiedByDefault="true" android:icon="@drawable/ic_action_search" app:actionViewClass="android.support.v7.widget.SearchView" app:showAsAction="ifRoom|collapseActionView"/> <--this one </menu> 

这将为您提供所有function。不要忘记在发送查询时,在SearchView上调用“clearFocus”方法closures键盘。

 @Override public boolean onCreateOptionsMenu(Menu menu) { getSupportMenuInflater().inflate(R.menu.home_screen, menu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); final MenuItem searchMenuItem = menu.findItem(R.id.menu_search); final SearchView searchView = (SearchView) searchMenuItem .getActionView(); searchView.setIconifiedByDefault(false); if (searchManager != null && searchView != null) { searchView.setSearchableInfo(searchManager .getSearchableInfo(getComponentName())); searchView .setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { if (searchMenuItem != null) { searchMenuItem.collapseActionView(); }// end if if (searchView != null) { searchView.setQuery("", false); }// end if }// end if } }); searchView .setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { /** * hides and then unhides search tab to make sure * keyboard disappears when query is submitted */ if (searchView != null) { searchView.setVisibility(View.INVISIBLE); searchView.setVisibility(View.VISIBLE); } return false; } @Override public boolean onQueryTextChange(String newText) { // TODO Auto-generated method stub return false; } }); } return super.onCreateOptionsMenu(menu); } 

如果你想在用户点击键盘上的search图标时折叠键盘,可以通过简单的方式实现

inside onquerytextsubmitted {

searchView.clearfocus()

}

你需要调用setIconified两次。

要实际折叠您的search视图并closures键盘。
search视图的第一个调用文本被第二个调用键盘清除,search视图closures。

出于某种原因, menuItem.collapseActionView()没有工作,所以我用searchView.setIconified(true)来代替。

这给出了下面的结果作为代码示例。

 final MenuItem searchItem = (MenuItem) menu.findItem(R.id.menu_item_search); final SearchView searchView = (SearchView) searchItem.getActionView(); searchView.setOnQueryTextFocusChangeListener(new SearchView.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { searchView.setIconified(true); } } });