SearchView.OnCloseListener не вызывается

Я использую панель действий и добавляю к ней searchView. Я реализовал searchView.onCLoseListener, но, похоже, он не вызывается. Какие-либо предложения ?

Мой код выглядит примерно так:

SearchView searchView = new SearchView(getContext());
searchView.setOnCloseListener(new OnCloseListener() {

  public boolean onClose() {
    searchView.setVisibility(SearchView.GONE);
    // Do Something

    return true;
  }
});

person lokoko    schedule 17.12.2012    source источник


Ответы (9)


Я столкнулся с той же проблемой на Android 4.1.1. Похоже, это известная ошибка: https://code.google.com/p/android/issues/detail?id=25758

Во всяком случае, в качестве обходного пути я использовал прослушиватель изменения состояния (когда SearchView отсоединен от панели действий, он также, очевидно, закрыт).

view.addOnAttachStateChangeListener(new OnAttachStateChangeListener() {

    @Override
    public void onViewDetachedFromWindow(View arg0) {
        // search was detached/closed
    }

    @Override
    public void onViewAttachedToWindow(View arg0) {
        // search was opened
    }
});

Вышеприведенный код хорошо работал в моем случае.

person Dario    schedule 04.07.2014
comment
Хороший подход. Работающий - person tornic; 25.04.2018
comment
Этим ответом ты сказал, что теперь ты в безопасности, мой милый ребенок, и я здесь, чтобы сказать тебе: я обязан тебе своей жизнью. Законно, этот ответ отлично работает. Нет толковых опций, управляющих статусом SearchView, и после дня поиска я нашел это и попробовал - и это просто. работает. Спустя четыре года после того, как это было опубликовано, оно по-прежнему чрезвычайно актуально. Определенно должен быть принятый ответ! - person TomQDRS; 24.12.2018
comment
Я хотел бы добавить, что это сработало только для меня, когда я написал... (new View.OnAttachStateChangeListener()... Мне потребовалось некоторое время, надеюсь, я смогу сэкономить вам время - person notADev; 28.05.2020
comment
6 лет спустя, и это все еще лучший ответ. Google еще не исправил это. - person BVB09; 30.07.2020

Чтобы вызвать метод onClose() из SearchView.OnCloseListener. Я сделал это следующим образом. Добавьте это в свой поиск

searchView.setIconifiedByDefault(true);
searchView.setOnCloseListener(this);

Теперь реализуйте этот прослушиватель onclick

  searchView.findViewById(R.id.search_close_btn)
                .setOnClickListener(new View.OnClickListener() {
                    @Override
                public void onClick(View v) {
                    Log.d("called","this is called.");
                    searchView.setQuery("",false);
                    searchView.setIconified(true);

                }
            });

Это сработало для меня. Поделитесь, чтобы это могло помочь кому-то еще. Спасибо

person Parmod    schedule 22.01.2017

В порядке. я получил ошибку. Мы не можем добавить searchCommand и сделать

setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW)

Это приведет к удалению searchText, если таковой имеется, и, следовательно, мы не можем выполнить onClose().

person lokoko    schedule 31.01.2013

Чтобы получать уведомления при нажатии значка «x», я добавил прослушиватель кликов к кнопке SearchView «x».

Найдите кнопку SearchView 'x' по идентификатору и прикрепите OnClickListener:

mSearchView.findViewById(R.id.search_close_btn)
    .setOnClickListener(this);

Представление search_close_btn присутствует в макете SearchView, предоставляемом платформой Android.

person Charlie    schedule 22.12.2016

    MenuItemCompat.OnActionExpandListener expandListener = new MenuItemCompat.OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            // Do something when action item collapses
            /*Hiding the mic on search visibility*/
                myMenu.findItem(R.id.action_speak).setVisible(false);
            Log.v("test","colllapse");
            return true;  // Return true to collapse action view
        }

        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            // Do something when expanded
            Log.v("test","expand");
            return true;  // Return true to expand action view
        }
    };

    //Searchview Initilisation
    MenuItem searchViewItem = menu.findItem(R.id.action_search);
    // Assign the listener to that action item
    MenuItemCompat.setOnActionExpandListener(searchViewItem, expandListener);

Дополнительная информация здесь: https://developer.android.com/training/appbar/action-views.html

person Ajay S    schedule 06.04.2017
comment
Это могло бы выиграть от некоторого дополнительного объяснения. - person Raidri; 06.04.2017

Чтобы решить аналогичную проблему, я создал новый класс, который расширил SearchView:

public class EnglishVerbSearchView extends SearchView {

OnSearchViewCollapsedEventListener mSearchViewCollapsedEventListener;

public EnglishVerbSearchView(Context context) {
    super(context);
}

@Override
public void onActionViewCollapsed() {
    if (mSearchViewCollapsedEventListener != null)
        mSearchViewCollapsedEventListener.onSearchViewCollapsed();
    super.onActionViewCollapsed();
}

public interface OnSearchViewCollapsedEventListener{
    public void onSearchViewCollapsed();
}

public void setOnSearchViewCollapsedEventListener(OnSearchViewCollapsedEventListener eventListener) {
    mSearchViewCollapsedEventListener = eventListener;
}

}

Затем вы можете использовать этот класс вместо SearchView в вашем XML-файле меню:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
    <item android:id="@+id/action_search"
      android:title="@string/action_search"
      android:icon="@drawable/action_search"
      yourapp:showAsAction="ifRoom|collapseActionView"
      yourapp:actionViewClass="com.szymontrapp.englishverbs.EnglishVerbSearchView" />
</menu>

И тогда вы можете добавить слушателя в свою активность:

    getMenuInflater().inflate(R.menu.dictionary, menu);
    MenuItem searchItem = menu.findItem(R.id.action_search);
    EnglishVerbSearchView searchView = (EnglishVerbSearchView)      MenuItemCompat.getActionView(searchItem);       

    // Get the SearchView and set the searchable configuration
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    // Assumes current activity is the searchable activity
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default

    searchView.setOnSearchViewCollapsedEventListener(listener);

Вы также можете переопределить другие методы в своем классе, заменяющие SearchView, для достижения других целей.

person Szymon    schedule 17.08.2013
comment
У меня есть аналогичная проблема здесь: stackoverflow.com/questions/43702055/. Есть мысли или идеи как исправить? - person AJW; 30.04.2017

Создайте пункт меню с app:showAsAction установленным на всегда.

<item   
 android:id="@+id/action_search"  
 android:title="..."  
 android:icon="..."  
 app:actionViewClass="android.support.v7.widget.SearchView"  
 app:showAsAction="always"/>

При создании SearchView в методе onCreateOptionsMenu сделайте что-то вроде этого

inflater.inflate(R.menu.menu_search, menu);
final MenuItem item = menu.findItem(R.id.action_search);
final SearchView search = (SearchView) item.getActionView();
search.setQueryHint(getString(R.string.search_brand_item));
search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
  @Override
  public boolean onQueryTextSubmit(String query) {
    // add your code
    return false;
  }

  @Override
  public boolean onQueryTextChange(String newText) {
    // add your code 
    return false;
  }
});
search.setOnCloseListener(new SearchView.OnCloseListener() {
  @Override
  public boolean onClose() {
    // add your code here
    return false;
  }
});
search.setIconifiedByDefault(true); // make sure to set this to true

search.setIconifiedByDefault(true) необходимо установить на true, чтобы вызвать метод onClose() для SearchView.OnCloseListener(), созданного выше.

person Ray Hunter    schedule 13.10.2017

Я также нахожу эту проблему. решение очень простое! Просто сохраните свое представление SearchView в приватной переменной var. Затем используйте

  • isShown способ проверить, был ли расширен вид,
  • searchview.addOnLayoutChange для определения searchview начать использовать isShown после того, как блокирует выполнение ваших действий,
  • переопределите onBackPressed с помощью if block(searchView !=null && searchView.isShown(), затем выполните свои действия, когда пользователь нажмет кнопку «Назад»,
  • и переопределить прослушиватель кнопок home(back) в блоке onOptionsItemSelected с помощью блока isShown. Примечание: в xml-файле пункта меню удалите флаг app:showAsAction CollapActionView.
person Nevidimka    schedule 03.05.2020

Если вы установили

searchView.setIconifiedByDefault(false)

тогда ваш searchView никогда не закрывается, так как он всегда находится в расширенном режиме. Это причина, по которой ваш onClose() не вызывается.

person Sai Kamisetti    schedule 18.05.2017