Android ActionBarSherlock, SearchView `setOnCloseListener` не работает

Я использую SearchView, и он работает нормально, но только setOnCloseListener не работает; Вот мой код

 import com.actionbarsherlock.widget.SearchView.OnCloseListener; 

а также

 searchView.setOnCloseListener(new OnCloseListener() { @Override public boolean onClose() { Toast.makeText(context, "close", Toast.LENGTH_SHORT).show(); return false; } }); 

** РЕДАКТИРОВАТЬ * * **

 @Override public boolean onCreateOptionsMenu(Menu menu) { //Used to put dark icons on light action bar //Create the search view final SearchView searchView = new SearchView(getSupportActionBar().getThemedContext()); searchView.setQueryHint("Search"); searchView.setIconifiedByDefault(true); //search button menu.add(Menu.NONE,Menu.NONE,1,"Search a word") .setIcon(R.drawable.abs__ic_search_api_holo_light) .setActionView(searchView) .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); MenuItem sView = menu.findItem(1); sView.setOnActionExpandListener(this); return true; } @Override public boolean onMenuItemActionCollapse(MenuItem item) { adopter.getFilter().filter(null); Toast.makeText(getApplicationContext(), "collapse", Toast.LENGTH_LONG).show(); return true; // Return true to collapse action view } @Override public boolean onMenuItemActionExpand(MenuItem item) { Toast.makeText(getApplicationContext(), "Expand", Toast.LENGTH_LONG).show(); return true; // Return true to expand action view } 

Solutions Collecting From Web of "Android ActionBarSherlock, SearchView `setOnCloseListener` не работает"

Решил сам. Просто оставьте setOnCloseListener он не будет работать, и onCreateOptionsMenu следующий код в onCreateOptionsMenu

 // searchView.setOnCloseListener(new OnCloseListener() { // @Override // public boolean onClose() { // adapter.getFilter().filter(""); // Toast.makeText(getBaseContext(), "on close", Toast.LENGTH_SHORT).show(); // return false; // } // }); MenuItem menuItem = menu.findItem(ID_OF_SEARCHVIEW); menuItem.setOnActionExpandListener(new OnActionExpandListener() { @Override public boolean onMenuItemActionExpand(MenuItem item) { adapter.getFilter().filter(""); return true; } @Override public boolean onMenuItemActionCollapse(MenuItem item) { adapter.getFilter().filter(""); return true; } }); 

Вы можете использовать OnActionExpandListener:

 public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { SearchView searchView = new SearchView(((SherlockFragmentActivity) getActivity()).getSupportActionBar().getThemedContext()); searchView.setIconifiedByDefault(true); // ... MenuItem menuItem = menu.add(R.string.search); // ... menuItem.setOnActionExpandListener(this); } @Override public boolean onMenuItemActionExpand(final MenuItem item) { mInSearchMode = true; return true; } @Override public boolean onMenuItemActionCollapse(final MenuItem item) { mInSearchMode = false; return true; } 

Я использую этот код. И он отлично работает

  @Override public void onStartSearch() { } @Override public void onSearch(String search) { } @Override public void onCloseSearch() { } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.your_menu, menu); // Associate searchable configuration with the SearchView MenuItem searchItem = menu.findItem(R.id.action_search); mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem); //here I user appcompat, but you can take it just from actionbarsherlock SearchView.SearchAutoComplete searchAutoComplete = (SearchView.SearchAutoComplete) mSearchView.findViewById(android.support.v7.appcompat.R.id.search_src_text); searchAutoComplete.setTextColor(getResources().getColor(R.color.action_bar_text_color)); mSearchView.setIconifiedByDefault(true); mSearchView.setSubmitButtonEnabled(false); /** * Set all of different kinds of listeners */ MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() { @Override public boolean onMenuItemActionCollapse(MenuItem item) { menuIsOpen = false; onCloseSearch(); return true; } @Override public boolean onMenuItemActionExpand(MenuItem item) { menuIsOpen = true; onStartSearch(); return true; } }); mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextChange(String s) { onSearch(s); return false; } @Override public boolean onQueryTextSubmit(String s) { onSearch(s); return true; } }); super.onCreateOptionsMenu(menu, inflater); } /** * Function for closing search when android is less than 14 */ public boolean onBackButton() { if (AndroidUtils.getSdkVersion() >= 14) return false; if (menuIsOpen) { menuIsOpen = false; getActivity().supportInvalidateOptionsMenu(); onCloseSearch(); return true; } return false; } 

После того, как backButton закроет поиск, или просто откройте панель действий.

Я столкнулся с той же проблемой, когда onCloseListener не вызывается для SearchView. Поймите из проблемы с ошибкой, поднятой в 25758 , и некоторых сообщений, которые я прочитал, чтобы вызвать onCloseListener, вам нужно установить:

 searchView.setIconifiedByDefault(true); 

Но для моего случая я хотел, чтобы поиск был открыт и не отображался все время. Мне удалось решить эту проблему, добавив еще одну строку ниже:

 @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.search_bar, menu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); searchView = (SearchView) menu.findItem(R.id.search).getActionView(); searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); searchView.setOnQueryTextListener(queryTextListener); searchView.setIconifiedByDefault(true); searchView.setIconified(false); return true; } 

SearchView.setIconified (false) приведет к тому, что searchView откроется, несмотря на то, что в предыдущей строке значение по умолчанию указано в true. Таким образом, мне удалось найти и SearchView, который открывается все время и вызывает его onCloseListener.